我怎样才能实际使用AddressSanitizer和MemorySanitizer?

时间:2017-03-15 22:35:18

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

AddressSanitizer和MemorySanitizer是非常有用的工具,但它们要求对整个程序进行适当的检测。 (至少,对于Clang版本的AddressSanitizer;请参阅MemorySanitizer文档中的here和"使用@ {3}}的全局和#34;部分的私有别名。)

如果采用它的话,这意味着需要使用适当的编译器标志构建所有库依赖项以启用ASan或MSan。对于需要各种第三方依赖关系的典型Linux应用程序,这是一种实用的方法吗?清洁剂显然是一个谷歌项目,我得到的印象是谷歌代码大多只使用他们自己的monorepo和他们自己的AddressSanitizerClangVsGCC,但这可能超出普通开发人员的范围。是否有一种简单的方法可以使用Sanitizers构建库而无需投入大量额外的基础架构或构建脚本?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

清洁剂可以轻松地用在您自己的代码上,而无需重建系统依赖性。我经常在RHEL 6&amp ;;上使用大型(ish)2M线路代码。 7同时使用GCC和Clang - 这不是问题。如果是问题;你做错了(或者有一个需要修理的错误)。