Какое из трех взаимоисключающих дезинфицирующих средств Clang следует использовать по умолчанию?

В Clang есть несколько дезинфицирующих средств, которые позволяют проверять сомнительное поведение во время выполнения. . К сожалению, все они не могут быть включены одновременно.

Невозможно комбинировать более одной из -fsanitize=address, -fsanitize=thread и -fsanitize=memory шашек в одной и той же программе.

Что еще хуже, каждый из этих трех кажется слишком полезным, чтобы его упускать. AddressSanitizer проверяет наличие ошибок памяти, ThreadSanitizer проверяет условия гонки, а MemorySanitizer проверяет неинициализированные операции чтения. Я беспокоюсь обо всем этом!

Очевидно, что если у меня есть предчувствие о том, где находится ошибка, я могу выбрать дезинфицирующее средство в соответствии с этим. Но что, если я этого не сделаю? Идя дальше, что, если я хочу использовать дезинфицирующие средства в качестве профилактического, а не диагностического инструмента, чтобы указать на ошибки, о которых я даже не знал?

Другими словами, учитывая, что я не ищу ничего конкретного, с каким дезинфицирующим средством мне следует компилировать по умолчанию? Ожидается ли, что я просто скомпилирую и протестирую всю программу три раза, по одному разу для каждого дезинфицирующего средства? ?


person Maxpm    schedule 16.05.2018    source источник


Ответы (1)


Как вы указали, дезинфицирующие средства, как правило, взаимоисключающие (вы можете комбинировать только Asan + UBsan + Lsan через -fsanitize=address,undefined,leak, возможно, также добавить Isan через -fsanitize=...,integer, если ваша программа не содержит преднамеренных неподписанных переполнений), поэтому единственный способ обеспечить полное покрытие — это делать отдельные прогоны QA с каждым из них (что подразумевает пересборку ПО для каждого прогона). Кстати, рекомендуется сделать еще один запуск с Valgrind.

Использование Asan в производстве имеет два аспекта. С одной стороны, общеизвестно, что некоторые ошибки могут быть обнаружены только в производственной среде, поэтому вы делаете время от времени запускать очищенные сборки, чтобы увеличить покрытие тестами [*]. С другой стороны, сообщалось, что в некоторых случаях Asan увеличивает поверхность атаки (см., например, этот отчет о безопасности OSS), поэтому использование его в качестве решения для защиты (для предотвращения ошибок, а не для их обнаружения) не рекомендуется.

[*] В качестве примечания: разработчики Asan также настоятельно рекомендуют использовать фаззинг для увеличения охвата (см., например, Cppcon15 и CppCon17.

[**] См. Часто задаваемые вопросы по Asan, чтобы узнать, как сделать AddressSanitizer более строгий (ищите "агрессивная диагностика")

person yugr    schedule 16.05.2018
comment
Не могли бы вы опубликовать флаг, объединяющий дезинфицирующие средства A, UB и L? Это -fsanitize=address,undefined,leak? - person shuhalo; 20.09.2019
comment
@shuhalo Да, ты прав. Я добавил это к ответу. - person yugr; 20.09.2019