【问题标题】:Thread Sanitizer - How to interpret the Read vs Previous Write warningThread Sanitizer - 如何解释 Read vs Previous Write 警告
【发布时间】:2021-12-29 03:59:08
【问题描述】:

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

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

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

【问题讨论】:

  • "...有没有办法在接下来的运行中抑制这个特定的警告?" - 是的,修复数据竞争;这是未定义的行为。

标签: c++ multithreading gcc thread-sanitizer


【解决方案1】:

警告是真正的错误(除非是误报)。

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

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

如果你坚持,有办法让他们沉默,创建一个 supp.txt 文件:

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

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

【讨论】:

    猜你喜欢
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    相关资源
    最近更新 更多