OS X上的Clang Address Sanitizer

时间:2013-04-21 10:26:14

标签: macos clang sanitizer address-sanitizer

我想在OSX Mountain Lion上使用clang address sanitizer,因为Valgrind在这个平台上有内存检查问题。 但是当我在编译期间有-fsanitize=address时(就像我在此页面上看到的那样:http://clang.llvm.org/docs/AddressSanitizer.html),我收到了这个错误:clang: error: argument unused during compilation: '-fsanitize=address'

所以,我的问题是如何在OS X上使用Clang Address Sanitizer?如果我不能使用它,我可以使用哪种工具?

我已经下载了Xcode并且它是最新的。 (也许这个版本没有用它来解决消毒剂的构建)

3 个答案:

答案 0 :(得分:13)

地址Sanitizer已添加为Xcode 7中的新功能。

使用Runtime Sanitization>您的方案中的Enable Address Sanitizer标志启用该选项。

然后, git会向您的.xcscheme文件显示此更改:

enableAddressSanitizer = "YES"

来自New Features in Xcode 7文件:

  

地址Sanitizer。 Xcode 7可以使用旨在使用地址清理程序捕获和调试内存损坏的工具构建您的应用程序。

     

Objective-C和C代码易受内存损坏问题的影响,例如堆栈和堆缓冲区溢出以及免费后使用问题。当发生这些内存违规时,您的应用程序可能会无法预测崩溃或显示奇怪的行为。内存损坏问题很难追查,因为崩溃和奇怪的行为往往难以重现,原因可能远不是问题的根源。

Enable Address Sanitizer

  

您在构建方案中启用了地址清理程序。启用后,应用程序内置了添加的工具以立即捕获内存冲突,使您能够在发生问题的位置检查问题。还提供了其他诊断信息,例如故障地址与堆上的有效对象之间的关系以及分配/解除分配信息,这有助于您快速查明并修复问题。

     

地址清理程序的效率足够快,可以定期使用,也可以与交互式应用程序一起使用。它在OS X,模拟器和iOS设备上都受支持。

答案 1 :(得分:11)

Xcode中的AddressSanitizer支持还没有完全成熟。请考虑使用主干Clang(请参阅http://code.google.com/p/address-sanitizer/wiki/HowToBuild了解构建说明)

答案 2 :(得分:6)

根据来源(特别是如果您从clang-425.0.24抓取Apple's Open Source Site捆绑包,测试文件src/tools/clang/test/Driver/darwin-asan-nofortify.c

// rdar://11496765, rdar://12417750
// -faddress-sanitizer is not currently supported.
// XFAIL: *

当然,使用-faddress-sanitizer时出现错误,所以看起来在OS X下,你需要自己从更新的源码构建clang才能获得地址清理程序。

命令行选项

尝试使用-faddress-sanitizer代替-fsanitize=address。 Apple的版本似乎是基于较旧版本的CLANG,如果您运行clang --help,则此版本中的消毒剂都是这种形式。