问题标签 [thread-sanitizer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
34 浏览

catch2 - 在 ThreadSanitizer 中禁用线程泄漏测试?

我将 ThreadSanitizer 与 Catch2 一起使用。不幸的是,ThreadSanitizer 在我的代码中发现了带有 Catch2 和线程竞争条件的线程泄漏。有什么方法可以禁用 ThreadSanitizer 的线程泄漏检测但继续进行竞争条件测试?

0 投票
1 回答
388 浏览

c++ - 为什么线程清理程序抱怨获取/释放线程围栏?

我正在学习不同的记忆顺序。

我有这段代码,它可以工作并通过 GCC 和 Clang 的线程消毒剂

我认为如果它最终没有返回from,那么“获取”加载是不必要的,所以我决定使用“放松”加载,然后是“获取”围栏。

我希望它能够工作,但它被 thread sanitizers 拒绝,它声称 concurrentstate++是数据竞争。

为什么这是一场数据竞赛?

Cppreference

原子栅同步

线程 A 中的原子释放操作 X 与线程 B 中的获取栅栏 F 同步,如果

  • 存在原子读取 Y(具有任何内存顺序)
  • Y 读取 X 写入的值(或以 X 为首的释放序列)
  • Y 在线程 B 中排在 F 之前

在这种情况下,在线程 A 中的 X 之前排序的所有非原子和松弛原子存储将发生在 F 之后线程 B 中相同位置的所有非原子和松弛原子加载之前。

据我了解,所有条件都满足:

  • “存在原子读取 Y(具有任何内存顺序)” - 检查:a.load(std::memory_order_relaxed)
  • “Y 读取 X 写入的值”——检查,它从 读取值a.store(to, std::memory_order_release);
  • “Y 在线程 B 中排在 F 之前”——检查。
0 投票
1 回答
38 浏览

c++ - 如何为线程清理程序注释 seq-cst 原子栅栏?

我了解到TSAN 不理解std::atomic_thread_fence,要修复它,您需要告诉 TSAN 哪些原子变量受围栏影响,通过放置__tsan_acquire(void *)__tsan_release(void *)旁边(分别用于获取和释放围栏)。

但是 seq-cst 栅栏呢?据我了解,它们比 acq-rel 围栏更严格,所以 acq-rel 注释可能还不够?

我对不同的内存顺序不太熟悉,所以我可能会遗漏一些东西。

0 投票
0 回答
32 浏览

c++ - 代码如何知道它是使用 AddressSanitizer 或 ThreadSanitizer 编译或运行的?

如果我的 C++ 程序是用 AddressSanitizer 或 ThreadSanitizer 编译的,我希望它能够打印。AddressSanitizer中提出的解决方案:我们怎么知道 C 中的目标文件/可执行文件是用 AddressSanitizer 编译的?将不起作用,因为我不希望程序必须打开自己的目标代码并以这种方式探索自己。有#define它可以检查的吗?我可以添加自己的,但如果已经存在,我不想添加。

0 投票
2 回答
74 浏览

c++ - 我可以在 Windows 10 上使用 Thread Sanitizer 吗?

我想在 Windows 10(64 位)上用 C++ 测试数据竞争,但Visual C++ 似乎还不支持它。因此,我安装了 Cygwin 并获得了 g++ 11.2.0,尝试使用 编译我的 C++ 代码-fsanitize=thread -fPIE -pie -g,但失败并-ltsan not found出现错误。

该文档没有提及有关 Windows 的任何内容。甚至可以在 Windows 上使用 Thread Sanitizer 吗?如果是这样,如何?

0 投票
0 回答
47 浏览

c++ - TSan 种族随着 alignas 消失 (32)

我有一个无锁队列的实现,我认为它是正确的(或者至少是无数据竞争的):

这个队列被实现为一个单链双端链表。它使用虚拟节点来解耦生产者和消费者,并使用生成计数器和节点回收(使用内部堆栈)来避免 ABA 问题和try_dequeue.

在使用 Clang 13.0.1、Linux x64 编译的 TSan 下运行它,我得到了以下比赛:

在 Godbolt 上运行(注意,由于 Godbolt 运行程序的方式,TSan 不显示行号信息)

这场比赛是在从线程try_dequeue调用的先前读入之间进行的:consumer

这稍后会写入,这是线程enqueue的第三次调用:enqueueproducer

我相信这场比赛是不可能的,因为线程应该通过获取-释放比较交换producer与线程同步到in和.consumerstack_topallocate_nodedeallocate_node

现在,奇怪的是,制造GenNodePointer alignas(32)消除了比赛。

在神螺栓上运行

问题:

  1. 这场比赛真的可能吗?
  2. 为什么增加 GenNodePointer 的对齐会使 TSan 不再注册比赛?