如何检测 gcc 5 的线程清理程序

Cur*_*ous 6 c++ gcc thread-sanitizer c++14

如何检测使用 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;
}
Run Code Online (Sandbox Code Playgroud)

https://wandbox.org/permlink/t5qYme4Whyj54aYV。这在具有线程清理程序的 clang 版本上进行编译;但不适用于某些 gcc 版本(特别是 5)


功能检查和__SANITIZE_THREAD__宏都可用于检测线程清理程序何时打开,因此测试可以抑制误报(例如,当线程清理程序捕获实际上不是数据争用的错误时)请参阅了解更多信息

Wyc*_*yck 6

我不知道,但作为最后的手段,以下命令行将查找#define 如果存在):

diff <(gcc -dM -E -x c /dev/null) <(gcc -fsanitize=thread -dM -E -x c /dev/null)
Run Code Online (Sandbox Code Playgroud)

在我的 gcc 7.4.0 上它输出:

> #define __SANITIZE_THREAD__ 1

...这意味着如果您正在使用 则__SANITIZE_THREAD__定义为,但如果您不使用则未定义。因此,您应该保护您的代码,而不是直接使用该符号。1-fsanitize=thread#ifdef __SANITIZE_THREAD__

附加信息:

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

  • 这不是最后的手段,检查文档后不久就会出现。遗憾的是,在这种情况下,使用 gcc-5,输出为空。 (2认同)