2

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

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

4

2 回答 2

2

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

至于 MemorySanitizer,它确实需要重新构建它的所有依赖项。这是该工具未在 Google 之外广泛使用的主要原因。

于 2017-03-16T08:10:09.070 回答
1

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

于 2017-03-15T22:40:46.937 回答