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