问题标签 [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.
c++ - std::future 可以比 std::promise 活得更久吗?
clang ThreadSanitizer在以下代码中报告数据竞争:
我可以通过替换来修复p = std::move(p)
比赛&p
。但是,我找不到解释promise
andfuture
对象是否是线程安全的或者它们被销毁的顺序是否重要的文档。我的理解是,由于承诺和未来通过“共享状态”进行通信,因此状态应该是线程安全的,销毁顺序应该无关紧要,但 TSan 不同意。(没有 TSan,程序似乎运行正常,而不是崩溃。)
这段代码是否真的有潜在的竞争,或者这是一个 TSan 误报?
您可以通过在 Ubuntu 19.10 Docker 容器中运行以下命令,使用 Clang 9 重现这一点:
显示数据竞争的示例输出(实际输出在运行之间略有不同):
ios - (Xcode 11.2.1) 找不到 Thread Sanitizer 运行时支持库 (iOS)
使用 Xcode 11.2.1 为 iOS 创建了一个 View 项目,并在 Scheme 中启用了 Thread Sanitizer。注意:在模拟器iPhone Xr 13.2.2上运行应用程序
运行项目后,出现以下错误:
请求被服务委托 (SBMainWorkspace) 拒绝,原因是:未指定(“null”)。
当将可执行文件设置为启动时询问时,会出现以下错误:
找不到 Thread Sanitizer 运行时支持库。请通过设置 DYLD_INSERT_LIBRARIES 环境变量手动指定它。
如果禁用Thread Sanitizer,则应用程序在模拟器中正常启动。
在这种情况下的任何帮助将不胜感激。谢谢!
c++ - 这个线程消毒剂警告中的比赛在哪里?
以下代码在 macOS 上使用 thread sanitizer 运行时会产生警告。我看不到比赛在哪里。shared_ptr 和weak_ptr 的控制块是线程安全的,并且std::queue
通过持有锁来完成推送和弹出操作。
堆栈跟踪警告:
编辑:我编译它:
铿锵版本:
我正在使用 macOS 10.14.6
c++ - tsan 对 notify_all_at_thread_exit 的投诉
当我运行从分离线程调用 notify_all_at_thread_exit() 的代码时,tsan 抱怨 pthread_cond_broadcast 和 pthread_cond_destroy 之间的数据竞争。难道我做错了什么?或者这是来自tsan的误报?
FWIW,使用 clang8 和 libc++ 从 TSAN 收到一个非常相似的错误:
ios - Xcode 11.2.1 Thread Sanitizer abort_with_payload
我正在尝试在 Xcode 11.2.1 中使用 Thread Sanitizer,但是每当应用程序启动时(只是 Xcode 模板中的一个视图应用程序,没有添加任何内容),它都会触发 __abort_with_payload:
Apple 的文档或其他人使用 Thread Sanitizer 的指南都没有说除了在方案设置中打勾外,您还需要做任何事情,但对我来说这不起作用:(
打印出 $arg5 给出
pthread_t 已损坏
这听起来不太好!
这是在 Catalina 10.15.2 上使用 iPhone 11 Pro Max 模拟器
c++ - OpenMP 中并行块外的竞争条件 (ThreadSanitizer);假阳性?
以下最小示例计算从 1 到 1000 的所有数字的总和,并与 OpenMP 并行化:
我尝试使用clang++-6.0.0
andg++-5.4.0
和 ThreadSanitizer 来编译它。libomp.so
两个编译器都会在/中产生一些关于竞争条件的警告libgomp.so
,我假设这是误报,以及关于我的代码的以下警告:
不过,我在我的代码中看不到任何数据竞争!
我也尝试用atomic
一个部分替换更新critical
,如下所示:
这改变了警告,但新的警告没有多大意义:
这些警告是真实数据竞争的迹象,还是误报?
c - 未检测到 ThreadSanitizer 死锁并且最后没有结果(由于死锁程序)
我想知道线程清理程序(clang)的死锁在哪里,但问题是程序被阻止并且在使用 -fsanitize=thread 选项的编译期间未检测到死锁。并且在执行结束时没有结果,因为程序被阻塞(由于死锁而无法退出程序)。
c++ - 调用接收到的事件实例时使用 QCoreApplication::postEvent() 报告线程清理程序
我有以下代码:
在哪里
我得到了线程消毒剂报告,但不知道为什么。
考虑到 EventReceiver 是在线程中创建并发布到主线程,为什么会发生这种情况,这似乎是虚拟方法执行的竞争,但此时对象已完全构造。
后期编辑 虽然这似乎是一场良性的比赛。消毒剂不知道/看到 EventReceiver::event(QEvent* event) 在使用 QCoreApplication::postEvent(&target, event) 之后发生/由使用 QCoreApplication::postEvent(&target, event) 引起,这发生在 MyEvent 构造之后(因为 MyEvent 实例输入到 QCoreApplication::事后)
我可以添加明确的围栏以使消毒剂清楚这一点,但这似乎过分了?想知道是否建议只使用一些注释来禁用它。
gcc - 在代码中使用 ThreadSanitizer 的 Mutex 名称
我正在使用 GCC 9.2 TSan 来分析我的代码库的运行时多线程行为(明确使用 pthreads——我们在 C++11 之前开始)。在持有已销毁的互斥锁时,我进行了数据竞赛,其中包含以下内容(相对无用):
并且没有关于这个互斥体是在哪里创建或在哪里被破坏的更多信息。TSan 报告访问的堆位置的堆栈跟踪,堆内存分配的位置和线程的创建,但没有互斥体被破坏的位置的堆栈跟踪。
我想将一些调试输出添加到我可能为这些互斥锁候选的地方,但如果我不能以任何方式将调试语句互斥锁与报告的互斥锁相关联,这对我没有帮助——因此问题是:
有没有办法M974039071667323520
在我自己的代码中使用 ThreadSanitizer 报告的互斥锁名称?
从我通过 gcc 的代码库 grepping 大约 10 分钟收集到的信息来看libsanitizers/tsan/
,内部计数器似乎uid_gen_
是原子递增的,SyncVar
这意味着它是 tsan 的私有值,并且无法在我的代码中获取该值,这是正确的吗?