Как я могу определить, скомпилирован ли UBSAN с использованием clang или gcc?

Мы используем следующий код, чтобы определить, -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

6

Решение

Я предлагаю вам подать это как ошибку в ASan github (или в GCC bugzilla) по этому поводу (мы уже определили для ASan и TSan, так что имеет смысл также подготовить одну для UBSan). На данный момент кажется, что ваш единственный вариант — передать пользовательское определение вместе с -fsanitize-undefined в Makefile.

2

Другие решения

Запрос на это был открыт в 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
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector