1

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

==================
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...]
==================

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

4

1 回答 1

5

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

线程 T27 将 8 个字节写入地址,而主线程稍后在没有锁定0x7f7eefc4e298的情况下读取了前 4 个字节(据 sanitizer 所知)。这是一个竞争条件和未定义的行为。

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

如果你坚持,有一种方法可以让它们静音,创建一个supp.txt文件:

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

TSAN_OPTIONS="suppressions=supp.txt"然后使用设置的环境变量运行您的测试。抑制文件的格式有一个稀疏的文档。另一个编译时选项使用-fsanitize-ignorelist它应该禁用检测本身。

于 2021-11-18T08:54:33.553 回答