如何检测 gcc 5 的线程清洁剂

How to detect thread sanitizer for gcc 5

如何检测是否已为使用 gcc 5 的构建打开线程清理器? __has_feature(thread_sanitizer)__SANITIZE_THREAD__ 之间的两者都不起作用

#include <iostream>

using std::cout;
using std::endl;

int main() {
    cout << __has_feature(thread_sanitizer) << endl;
    cout << __SANITIZE_THREAD__ << endl;
}

https://wandbox.org/permlink/t5qYme4Whyj54aYV。这会在具有线程清理器的 clang 版本上编译;但不适用于某些 gcc 版本(特别是 5)


功能检查和 __SANITIZE_THREAD__ 宏都可用于检测线程清理程序何时打开,因此测试可以抑制假阴性(例如,当线程清理程序捕获实际上不是数据的错误时种族)见this了解更多

我不知道,但作为最后的手段,下面的命令行会找到一个 #define 如果它存在:

diff <(gcc -dM -E -x c /dev/null) <(gcc -fsanitize=thread -dM -E -x c /dev/null)

在我的 gcc 7.4.0 上它输出:

> #define __SANITIZE_THREAD__ 1

...这意味着如果您使用 -fsanitize=thread__SANITIZE_THREAD__ 被定义为 1,但如果您使用 未定义 你没有。所以你应该在 #ifdef __SANITIZE_THREAD__ 后面保护你的代码,而不是直接使用符号。

附加信息:

checked the gcc source__SANITIZE_THREAD__ 宏直到 7.1.0 版本才引入。