【问题标题】:How to detect thread sanitizer for gcc 5如何检测 gcc 5 的线程消毒剂
【发布时间】:2019-12-21 07:41:57
【问题描述】:

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

【问题讨论】:

  • 关于近距离投票:如何让问题更清楚?
  • 只是好奇; 为什么你需要这个?
  • “检测”如何?什么时候?为什么?在什么方面?
  • __SANITIZE_THREAD__ 仅存在于 gcc-7+ 中。
  • @Curious 好的,有道理

标签: c++ gcc c++14 thread-sanitizer


【解决方案1】:

我不知道,但作为最后的手段,下面的命令行会找到一个 #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__后面,而不是直接使用这个符号。

附加信息:

直到 7.1.0 版本才引入 checked the gcc source__SANITIZE_THREAD__ 宏。

【讨论】:

  • 这不是万不得已,检查文档后不久就会出现。遗憾的是,在这种情况下,使用 gcc-5,输出为空。
  • 你能解释一下这个命令是如何工作的吗?它在做什么?好奇:)
  • @Curious -E 调用预处理器并将输出发送到标准输出。 -dM 显示定义的宏(需要指定 -E)。 -x c 强制编译为 C 文件。 (您也可以使用-x c++)最后/dev/null 将输入文件设置为/dev/null(无)。然后,它会区分带有和不带有 -fsanitize=thread 标志的预处理器输出。
猜你喜欢
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
相关资源
最近更新 更多