Какое из трех взаимоисключающих дезинфицирующих средств Clang мне по умолчанию? - PullRequest
0 голосов
/ 16 мая 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 16 мая 2018

Как вы указали, дезинфицирующие средства, как правило, являются взаимоисключающими (вы можете комбинировать только Asan + UBsan + Lsan), поэтому единственный способ обеспечить полное покрытие - это выполнить отдельные прогоны QA с каждым из них (что подразумевает перестройку SW для каждого прогона ).

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

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

...