内存/地址消毒剂与 Valgrind

2024-03-19

我想要一些工具来诊断释放后使用错误和未初始化的错误。我正在考虑 Sanitizer(内存和/或地址)和 Valgrind。但我对它们的优点和缺点知之甚少。谁能告诉我 Sanitizer 和 Valgrind 的主要特点、区别和优缺点吗?

编辑:我发现了一些比较,例如:Valgrind 使用 DBI(动态二进制检测)而 Sanitizer 使用 CTI(编译时检测)。无论 Sanitizer 的运行速度是否比 Valgrind 快得多(2 倍),Valgrind 都会使程序变慢(20 倍)。如果有人能给我一些需要考虑的更重要的观点,那将是一个很大的帮助。


我想你会发现这个wiki https://github.com/google/sanitizers/wiki/AddressSanitizerComparisonOfMemoryTools useful.

TLDR 消毒剂的主要优点是

  • CPU 开销小得多(Lsan 实际上是免费的,UBsan/Isan 是 1.25 倍,Asan 和 Msan 对于计算密集型任务是 2-4 倍,对于 GUI 是 1.05-1.1 倍,Tsan 是 5-15 倍)
  • 检测到的更广泛的错误(堆栈和全局溢出、返回后使用/范围)
  • 完全支持多线程应用程序(Valgrind 对多线程的支持就是个笑话)
  • 内存开销小得多(Asan 高达 2 倍,Msan 高达 3 倍,Tsan 高达 10 倍,比 Valgrind 好得多)

缺点是

  • 更复杂的集成(您需要教您的构建系统理解 Asan,有时还需要解决 Asan 本身的限制/错误,您还需要使用相对较新的编译器)
  • MemorySanitizer 目前并不容易使用,因为它需要一个重建Msan下的所有依赖 https://github.com/google/sanitizers/wiki/MemorySanitizerLibcxxHowTo(包括所有标准库,例如 libc++);这意味着临时用户只能使用 Valgrind 来检测未初始化的错误
  • 消毒剂通常不能相互组合(唯一支持的组合是 Asan+UBsan+Lsan),这意味着您必须进行单独的 QA 运行来捕获所有类型的错误
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存/地址消毒剂与 Valgrind 的相关文章

随机推荐