检查AddressSanitizer之类的消毒剂是否处于活动状态

时间:2016-01-26 10:47:54

标签: sanitizer

我有几个版本的项目签出和编译。如果我发现错误,我会比较版本以缩小问题范围。有时我启用像AddressSanitizer这样的清洁剂。如果我重新使用可执行文件,我不记得它是否是使用清洁剂编译的。如果可执行文件工作正常,我不确定该错误是否存在,或者我是否在此版本中未包含清理程序。所以我必须重新配置和重建,以确保我有清洁剂。

有没有办法检查是否已使用清理程序编译可执行文件?

3 个答案:

答案 0 :(得分:2)

您需要使用__has_feature(address_sanitizer),请参阅http://clang.llvm.org/docs/AddressSanitizer.html(与其他清洁剂相同)。

答案 1 :(得分:2)

地址清理程序也可以使用GCC中的-static-libasan选项静态编译。静态编译地址清理程序是Clang中的默认模式。

如果您静态编译地址清理程序,则显然无法使用ldd来验证您的二进制文件是否已清理。在这种情况下,我使用nm并检查二进制文件中是否有清洁剂符号:

nm -an <executable> | grep asan

答案 2 :(得分:1)

来自man ldd

  

ldd打印命令行中指定的每个程序或共享库所需的共享库。

只要地址消毒剂需要与libasan.so库(清洁剂的实际实施)链接,您可以假设:

  • 如果ldd无法打印共享库libasan.so,则肯定意味着地址清理程序已关闭。

  • 如果ldd将打印共享库libasan.so,则表示您的链接器标志包含-lasan,否则在链接期间您将得到未解析的符号错误。除非您在构建系统时遇到错误,否则很可能启用了地址清理程序。

  • 如果您的建筑系统存在错误,请选择第三个选项。 ldd将打印libasan.so,但如果您转到链接器-lasan但未通过-fsanitize=address,则会关闭地址清理程序。这意味着您将可执行文件与地址清理程序相关联,但不包括对可执行文件的检查。

    或者您可以执行objdump -p以查看dymanic部分中是否需要libasan.soNEEDED libasan.so.0objdump可以提供与ldd相同(或更多)的信息。