我们使用以下代码来确定在编译时是否为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
答案 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