gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:44:21 25 4
gpt4 key购买 nike

如何检测是否已为使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com