如何检测 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 版本才引入。
如何检测是否已为使用 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 版本才引入。