Мы используем следующий код, чтобы определить, -fsanitize=address
был указан во время компиляции для clang и gcc. Как мы определяем, если -fsanitize=undefined
был указан?
bool isSanitized = false;
#if defined(__has_feature)
#if __has_feature(address_sanitizer)
isSanitized = true;
#endif
#elif defined(__SANITIZE_ADDRESS__)
isSanitized = true;
#endif
Я предлагаю вам подать это как ошибку в ASan github (или в GCC bugzilla) по этому поводу (мы уже определили для ASan и TSan, так что имеет смысл также подготовить одну для UBSan). На данный момент кажется, что ваш единственный вариант — передать пользовательское определение вместе с -fsanitize-undefined
в Makefile.
Запрос на это был открыт в https://github.com/google/sanitizers/issues/765 и впоследствии закрыт из-за отсутствия убедительного варианта использования.
Хаком для обнаружения присутствия убсана во время выполнения является поиск одного из его символов, обычно символа, связанного с неопределенным поведением, которое вас интересует. Например, чтобы определить, дезинфицирует ли убсан __builtin_unreachable
Вы можете проверить наличие __ubsan_handle_builtin_unreachable
:
extern "C" void __attribute__((weak)) __ubsan_handle_builtin_unreachable();
if (&__ubsan_handle_builtin_unreachable)
; // ubsan is present
else
; // ubsan is not present