如何实际使用 AddressSanitizer 和 MemorySanitizer?

How can I practically use AddressSanitizer and MemorySanitizer?

AddressSanitizer 和 MemorySanitizer 是非常有用的工具,但它们要求整个程序 得到适当的检测。 (至少,对于 AddressSanitizer 的 Clang 版本;参见 here in the MemorySanitizer docs and the "using private aliases for globals" section of AddressSanitizerClangVsGCC。)

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

可以轻松地在您自己的代码上使用清理程序,而无需重建系统依赖项。我经常使用 GCC 和 Clang 在 RHEL 6 和 7 上使用大型(大约)2M 行代码库来执行此操作 - 这不是问题。如果有问题;你做错了(或者某处有错误需要修复)。

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

至于 MemorySanitizer,它确实需要重建所有依赖项。这是该工具未在 Google.

以外广泛使用的主要原因