如何检测使用 gcc 5 的构建是否已打开线程清理程序?两者之间都没有__has_feature(thread_sanitizer)
nor __SANITIZE_THREAD__
work
#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 https://wandbox.org/permlink/t5qYme4Whyj54aYV。这在具有线程清理程序的 clang 版本上进行编译;但不适用于某些 gcc 版本(特别是 5)
功能检查和__SANITIZE_THREAD__
宏对于检测线程清理程序何时打开非常有用,因此测试可以抑制误报(例如,当线程清理程序捕获实际上不是数据竞争的错误时)请参阅this https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual#suppressing-reports了解更多
我不知道,但作为最后的手段,下面的命令行会找到一个#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
...意思就是__SANITIZE_THREAD__
被定义为1
如果你正在使用-fsanitize=thread
, 但是没有定义的如果你不这样做。所以你应该保护你的代码#ifdef __SANITIZE_THREAD__
而不是直接使用符号。
附加信息:
I 检查了 gcc 源代码 https://github.com/gcc-mirror/gcc/commit/ed0b0569e1f4ee44bddb565f3331b4f09a5f592b和__SANITIZE_THREAD__
直到 7.1.0 版本才引入宏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)