gpt4 book ai didi

c++ - Thread Sanitizer - 如何解释读取与先前写入警告

转载 作者:行者123 更新时间:2023-12-03 08:13:59 25 4
gpt4 key购买 nike

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

==================
WARNING: ThreadSanitizer: data race (pid=2788668)
Read of size 4 at 0x7f7eefc4e298 by main thread:
[Stacktrace follows...]
Previous write of size 8 at 0x7f7eefc4e298 by thread T27:
[Stacktrace follows...]
Location is heap block of size 307272 at 0x7f7eefc1c000 allocated by thread T27
[Stacktrace follows...]
Thread T27 (tid=2790352, running) created by main thread at:
[Stacktrace follows...]
==================

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

最佳答案

该警告是一个真正的错误(除非它是误报)。

线程 T27 向地址 0x7f7eefc4e298 写入 8 个字节,主线程稍后不锁定读取该地址的前 4 个字节(据 sanitizer 程序所知)。这是竞争条件和未定义的行为。

换句话说,对0x7f7eefc4e298的访问不受锁或其他同步原语的保护。是这样吗?

如果您坚持,有一种方法可以让它们保持沉默,创建一个 supp.txt 文件:

# Silences all races originating in bar_function
race:foo_namespace::bar_function

然后使用 TSAN_OPTIONS="suppressions=supp.txt" 环境变量集运行测试。有一个sparse documentation用于抑制文件的格式。另compile-time option使用 -fsanitize-ignorelist 应该禁用检测本身。

关于c++ - Thread Sanitizer - 如何解释读取与先前写入警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70016851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com