如何确定是否已使用clang或gcc编译了UBSAN?

时间:2016-09-07 13:51:51

标签: c++ clang ubsan address-sanitizer

我们使用以下代码来确定在编译时是否为clang和gcc指定了-fsanitize=address。我们如何确定是否已指定-fsanitize=undefined

    bool isSanitized = false;
#if defined(__has_feature)
#if __has_feature(address_sanitizer)
    isSanitized = true;
#endif
#elif defined(__SANITIZE_ADDRESS__)
    isSanitized = true;
#endif

3 个答案:

答案 0 :(得分:2)

我建议你把这个作为一个错误提交给ASan github(或GCC bugzilla)关于这个(我们已经为ASan和TSan定义了,所以为UBSan做一个也是有意义的)。目前看来你唯一的选择就是在Makefile中将自定义定义与int a = 1111; a = a-- - --a; a = a++ + ++a; 一起传递。

答案 1 :(得分:1)

使用Clang,您现在可以非常类似于检查ASan来检查UBSan:

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

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

答案 2 :(得分:0)

为此请求在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