7

我们使用以下代码来确定是否-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
4

3 回答 3

2

我建议您将此作为错误提交给 ASan github(或 GCC bugzilla)(我们已经为 ASan 和 TSan 定义了,因此也为 UBSan 编写一个是有意义的)。目前看来,您唯一的选择是将自定义定义与-fsanitize-undefinedMakefile 一起传递。

于 2016-10-24T08:44:24.317 回答
2

使用 Clang,您现在可以像检查 ASan 一样检查 UBSan:

#if defined(__has_feature)
#  if __has_feature(undefined_behavior_sanitizer)
#    define HAS_UBSAN 1
#  endif
#endif

我不知道是否可以在 GCC 下进行检查。

于 2020-06-10T16:58:49.610 回答
1

对此的请求已在https://github.com/google/sanitizers/issues/765打开,随后因缺乏令人信服的用例而关闭。

在运行时检测是否存在 ubsan 的一种方法是查找其符号之一,通常是与您感兴趣的未定义行为相关联的符号。例如,要检测 ubsan 是否正在清理,__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
于 2018-09-28T19:38:39.730 回答