ThreadSanitizer 在 C 和 Go 中的检测盲区
Data races and the limits of ThreadSanitizer in C and Go
当并发代码引入非确定性 Bug 时,我们常依赖 ThreadSanitizer 来捕捉数据竞争。然而,即便是 Clang、GCC 和 Go 广泛使用的 ThreadSanitizer,也存在明显的检测盲区。文章深入剖析了 ThreadSanitizer 的算法原理,并揭示其在特定架构选择下的局限性:例如当线程总数超过 255 时,它可能无法可靠报告数据竞争;在 Go 的 sync.Pool 设计中,特定哈希冲突也会导致竞争被隐藏。作者通过构建理想化的 Python 解释器模拟 FastTrack 算法,直观展示了这些工具如何失效。了解这些限制并非否定工具价值,而是为了在编写高并发代码时建立更真实的信心。
数据竞争的存在,无论我们的测试是否因此失败,都意味着一个潜在的 Bug 绝对存在。