c++ - 如何实际使用 AddressSanitizer 和 MemorySanitizer?

标签 c++ c linux address-sanitizer memory-sanitizer

AddressSanitizer 和 MemorySanitizer 是非常有用的工具,但它们需要对整个程序进行适当的检测。 (至少,对于 AddressSanitizer 的 Clang 版本;请参阅 MemorySanitizer 文档中的 hereAddressSanitizerClangVsGCC 的“为全局变量使用私有(private)别名”部分。)

如果按其字面意思理解,这意味着所有库依赖项都需要使用适当的编译器标志来构建,以启用 ASan 或 MSan。对于需要各种第三方依赖项的典型 Linux 应用程序,执行此操作的实用方法是什么? Sanitizers 显然是 Google 的一个项目,我的印象是 Google 代码大多只使用他们自己的 monorepo 和他们自己的 build tools ,但这可能超出了一般开发人员的能力范围。有没有一种简单的方法可以使用 Sanitizers 构建库,而无需投资大量额外的基础设施或构建脚本?

最佳答案

AddressSanitizer 支持单独的检测,即您可以用它检测程序的一部分(单独的 DSO 甚至单独的目标文件)。但是请注意,如果您使用静态 Asan 运行时(这是 Clang 的默认运行时,除非您使用 -shared-libasan 构建),您必须检测主要可执行文件。共享运行时(GCC 中的默认设置)没有此问题,但如果未检测可执行文件,您将需要 LD_PRELOAD 它。参见 discussion in wiki了解详情。

至于 MemorySanitizer,它确实需要重建所有依赖项(初学者请参阅 this)。这是该工具未在 Google 之外广泛使用的主要原因。

关于c++ - 如何实际使用 AddressSanitizer 和 MemorySanitizer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42821991/

相关文章:

c++ - 为什么 AVIStreamRead 什么都不读?

c++ - 如何衡量管理内存所花费的时间

Kali Linux VM 中的 C 段错误

linux - 执行 grails -version 时在 VM 初始化期间发生错误

linux - 如何使用复制模块删除ansible中的临时文件

c++ - 在多个对象中初始化预定义成员变量的正确方法是什么?

c++ - 从十进制转换为二进制并返回位集时出现问题

c - 你如何截断而不是四舍五入? C

c - gcc 优化对 static const int 的引用,即使它已被修改

linux - 如果缓冲区大小太小而无法容纳 read() 系统调用返回的读取数据,会发生什么情况?