3

如何检测是否已为使用 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__宏都可用于检测线程清理程序何时已打开,因此测试可以抑制误报(例如,当线程清理程序捕获实际上不是数据竞争的错误时)请参阅了解更多信息

4

1 回答 1

3

我不知道,但作为最后的手段,以下命令行将找到#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__

附加信息:

检查了 gcc 源代码__SANITIZE_THREAD__直到 7.1.0 版才引入宏。

于 2019-08-14T18:31:07.577 回答