作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何检测是否已为使用 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 版本才引入。
关于c++ - 如何检测 gcc 5 的线程清洁剂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57499943/
我是一名优秀的程序员,十分优秀!