问题标签 [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 回答
35 浏览

fortran - 我应该如何使用 DataRaceBench 1.3.2?

我正在尝试安装并学习如何使用DataRaceBench 1.3.2这是一个基准套件,旨在系统地和定量地评估数据竞争检测工具的有效性,如此处所示在此处输入链接描述。我有一个称为poisson_openmp.f90Fortran 代码的代码,它计算矩形中泊松方程的近似解,旨在作为创建并行版本的起点。

为了安装它,我点击了这个链接: https ://github.com/LLNL/dataracebench/blob/master/user_guide.md

所以,我安装了ThreadSanitizerArcherROMPCoderrect Scanner

现在我应该:

仔细检查文件位置和添加的路径以获取正确的环境变量设置。要运行 DRB,请使用:./check-data-race.sh --toolname language( ./check-data-race.sh --romp fortran)

使用下面查看所有可能的选项:

我们甚至可以使用该--customize标志运行部分测试程序。应在文件中输入要运行的测试程序list.def和要测试的工具tool.def。其余步骤保持不变,可参考上述--help选项。

我不明白我应该如何使这一切适应我的代码以及如何测试它。我不明白我安装了什么东西。不知道什么是容器。我也不知道如何使用DataRaceBench 1.3.2来评估我的代码。我克隆了 git,我有文件夹,但我忽略了接下来要做什么,尤其是文件 check-data-races.sh。

我没有确切的问题,但我需要对此进行澄清。

0 投票
2 回答
326 浏览

swift - 使用 os_unfair_lock_lock 进行 Swift 访问竞赛

我制作了一个自定义属性包装器,它提供了一种使用os_unfair_lock. 在启用 TSAN 的情况下测试我的包装器后,在获取锁时报告了访问竞争错误os_unfair_lock_lock(如下图所示)

访问种族图像

不知何故,被认为是线程安全的锁定结构被 TSAN 报告为不是这样。这里发生了什么?

0 投票
1 回答
59 浏览

c - ThreadSanitaizer 未检测到 lock_cmpxchg 并警告数据争用

以下代码在数组的索引上使用 lock_cmpxchg 获取互斥锁,然后两个线程写入和读取相同的索引,但线程清理程序仍然说存在数据竞争。我怎么能告诉他线程之间有一个锁,因为它似乎没有检测到它。

流程是:很多线程使用不同的索引或相同的索引运行,如果两个线程具有相同的索引,则会出现唯一的数据竞争,但它有一个锁。但线程清理器警告 uint x = array[index]; 线程 1 有一个读取行并且有一个写入行 array[index] = random_value ; 我不知道为什么它会检测到数据竞争,感谢您的帮助!

0 投票
1 回答
313 浏览

visual-studio - Visual Studio 2019 中的 ThreadSanitizer

我正在尝试构建我的项目并在另一台机器上运行可执行文件,在那里我可以看到与线程相关的问题(如果存在)。我正在使用 VS2019 并-fsanitize=thread -fPIE -pie -gConfiguration Properties->Debugging->Command Arguments. 当我运行 .exe 文件时,我没有看到我认为应该生成的任何生成文件。我是否向编译器提供了错误的参数或者这里有什么问题?

0 投票
0 回答
46 浏览

c++ - 当正常程序运行完成时,tsan 下的 Clang 段错误

bazel我在单元测试中有以下测试代码:

该代码使用此处定义并此处实现的线程库。

图书馆有足够的道路里程,我希望它是正确的。但是,当我编译并运行我的测试程序时(在 clang 下)

我从 TSAN 得到以下输出:

这看起来非常相似,但可能与报告的 TSAN 错误(例如这个)不同。C++ 线程专家(或 TSAN 专家)可以以一种或另一种方式验证吗?

编辑: ThreadTools.hpp 的代码:

和 ThreadTools.cpp:

0 投票
1 回答
75 浏览

c++ - 如何在 ThreadSanitizer 堆栈跟踪中查找行号

我使用带有-g3-O1标志的 Clang 进行编译,但 TSan 抱怨它发现了一个数据竞争,并且它输出了一个完全模糊的堆栈跟踪,没有明确的行号。

在这种情况下如何找到行号?

由于 Stack Overflow 不支持超过 30k 的字符,Pastebin 上的输出。

https://pastebin.com/raw/6izxznym

0 投票
0 回答
21 浏览

thread-sanitizer - 当访问在 Mutex 下时,ThreadSanitizer 检测到竞态

我对以下 ThreadSanitizer 警告感到困惑:

据我从警告代码中可以看出,但读取和写入受 tsan 的同一个互斥锁(表示为 M1302)保护。

这怎么可能是一场比赛?我错过了什么?

0 投票
1 回答
67 浏览

c++ - Thread Sanitizer - 如何解释 Read vs Previous Write 警告

我正在运行一个带有线程清理程序的程序,并且想知道如何解释以下警告:

我将此消息解释为只是说主线程读取了以前由不同线程写入的内存。不同的线程是由主线程创建的,这个不同的线程也分配了内存。这个对吗?如果是这样,有没有办法在接下来的运行中抑制这个特定的警告?

0 投票
1 回答
84 浏览

c++ - 与 std::shared_timed_mutex::try_lock_until 的数据竞争

我正在尝试编写一个小测试用例来锻炼std::shared_timed_mutex::try_lock_until关于cppreference的文档。

这是我的代码

我期待的是

  1. main 获得一个读锁,然后启动 f 和 g
  2. f 尝试获取排他锁并阻塞
  3. g 获得读锁,读取global然后解锁读锁
  4. main 解锁读锁
  5. f 解锁、写入global、解锁和完成
  6. f 和 g 加入 7 断言为真且主要结束

(2 和 3 可以按任何顺序排列)。

这似乎可以单独工作。global在 gdb 下,如果我在 in的读取g和写入上放置断点f,然后运行,它会在读取时停止,正如我所期望的那样。

但是,如果我编译,-fsanitize=tthread那么我会遇到危险

在 gdb 下,tsan 版本不会阻塞排他锁并首先到达写入。

我意识到我的例子不好,我应该检查返回值而不是依赖超时。

谁能解释 tsan 正在改变什么?如果我使用普通的 lock/lock_shared/unlock/unlock_shared 函数,则 tsan 不再抱怨。

(请注意,我不能为此使用 DRD 或 Helgrind - 我正在为他们编写测试用例,我知道他们目前不支持此功能,至少在我使用的平台 Fedora 34 / GCC 11.2.1 amd64)。

编辑:这是第 3 版,现在可以使用。main 等待 cvg()完成,然后释放共享锁,然后f()可以获得排他锁。

0 投票
2 回答
96 浏览

multithreading - std::cout 插入运算符的线程安全

我一直认为 usingstd::cout << something是线程安全的。

对于这个小例子

我的期望是两个输出的顺序是不确定的(实际上这是我在实践中观察到的),但是调用operator<<是线程安全的。

但是,ThreadSanitizer、DRD 和 Helgrind 似乎都给出了关于访问 std::__1::ios_base::width(long) 和 std::__1::basic_ios<char, std::__1::char_traits >:: 的各种错误充满()

在 Compiler Explorer 上我没有看到任何错误

在 FreeBSD 13 上,ThreadSanitizer 给了我 3 个警告,上面列出的两个加上底层 i/o 缓冲区的 malloc/memcpy。

同样在 FreeBSD 13 中,DRD 给出了 4 个错误,width()两个fill()线程的时间为 2。

最后,FreeBSD 13 Helgrind 在线程创建中给出了一个已知的与 TLS 相关的误报,fill()并给出width()了两次。

在 Fedora 34 上

  • g++ 11.2.1 和 ThreadSanitizer 没有错误
  • DRD 用 g++ 编译的 exe 抱怨 fwrite 中的 malloc/memcpy
  • Helgrind 还抱怨 fwrite 以及构建cout, 再次使用 g++ 编译的 exe
  • clang++ 12 ThreadSanitizer 抱怨fill()width()
  • 带有 clang++ 编译器 exe 的 DRD 抱怨fill(),width()fwrite另一个start_thread
  • 带有 clang++ exe的Helgrind 抱怨一些 TLS fill()、、、、width()fwrite

macOS XCode clang++ ThreadSanitizer 也会生成警告(将是 libc++)。

查看 libc++ 和 libstdc++ 代码,我看不到任何保护width(). 所以我不明白为什么没有对编译器资源管理器的抱怨。

我尝试使用 TSAN_OPTIONS=print_suppressions=1 运行并且没有更多输出(g++ Fedora ThreadSanitizer)

似乎确实对width()fill()电话达成了一些共识。

更仔细地查看 libstdc++ 源代码,我发现有(带有一些修整和注释):

__out是流对象,cout在这种情况下是全局的。我看不到锁或原子之类的东西。

关于 ThreadSanitizer/g++ 如何获得“干净”输出的任何建议?

有这个有点神秘的评论

libc++ 代码看起来很相似。在iostream

并且在locale

我再次看到没有线程保护,但这次工具检测到了危险。

这些是真正的问题吗?对于普通调用operator<<的值width不会改变,并且始终为 0。