Как я могу практически использовать AddressSanitizer и MemorySanitizer?
AddressSanitizer и MemorySanitizer - очень полезные инструменты, но они требуют, чтобы вся программа была соответствующим образом оснащена. (По крайней мере, для версии Clang AddressSanitizer; см. Здесь в документации по MemorySanitizer и в разделе "Использование личных псевдонимов для глобальных переменных" AddressSanitizerClangVsGCC.)
Если взять его слово, это означает, что все зависимости библиотеки должны быть построены с соответствующими флагами компилятора, чтобы включить ASan или MSan. Для типичного приложения Linux, которое требует различных сторонних зависимостей, каков практический способ сделать это? Sanitizer - это, по-видимому, проект Google, и у меня складывается впечатление, что код Google в основном использует только свои собственные monorepo и собственные инструменты сборки, но это может быть недоступно среднему разработчику. Есть ли простой способ получить библиотеки, созданные с помощью Sanitizer, не вкладывая много лишней инфраструктуры или сценариев сборки?
2 ответа
AddressSanitizer поддерживает отдельное инструментарий, т. Е. С ним вы можете оборудовать только части своей программы (отдельные DSO или даже отдельные объектные файлы). Однако обратите внимание, что если вы используете статическую среду выполнения Asan (которая по умолчанию в Clang, если вы не строите с -shared-libasan
) Вы должны выполнить основной исполняемый инструмент. Общая среда выполнения (по умолчанию в GCC) не имеет этой проблемы, но вам нужно LD_PRELOAD
это если исполняемый файл не инструментирован. Смотрите обсуждение в вики для деталей.
Что касается MemorySanitizer, он действительно требует перестройки всех его зависимостей. Это главная причина, почему инструмент не широко используется за пределами Google.
Дезинфицирующие средства могут быть легко использованы в вашем собственном коде без восстановления системных зависимостей. Я делаю это обычно с большой (ish) 2М строкой кода на RHEL 6 и 7, используя GCC и Clang - это не проблема. Если это проблема; вы делаете это неправильно (или где-то есть ошибка, которую нужно исправить).