27

我想在 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 下载了 clang,它是最新的。(也许这个版本没有解决它构建的消毒剂)

4

3 回答 3

13

Address Sanitizer 已作为 Xcode 7 中的新功能添加。

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

然后 git 将显示此更改到您的.xcscheme文件:

enableAddressSanitizer = "YES"

来自Xcode 7 中的新功能文档:

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

Objective-C 和 C 代码容易受到内存损坏问题的影响,例如堆栈和堆缓冲区溢出以及释放后使用问题。当这些内存违规发生时,您的应用程序可能会意外崩溃或显示奇怪的行为。内存损坏问题很难追踪,因为崩溃和奇怪的行为通常很难重现,而且原因可能与问题的根源相去甚远。

启用地址清理程序

您在构建方案中启用地址清理程序。启用后,应用程序中会内置添加的检测以立即捕获内存违规,使您能够在问题发生的地方检查问题。还提供了其他诊断信息,例如错误地址与堆上有效对象之间的关系以及分配/释放信息,可帮助您快速定位和修复问题。

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

于 2015-06-17T20:57:27.897 回答
11

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

于 2013-04-26T10:55:44.413 回答
6

根据来源(特别是如果您从Apple 的开源站点获取clang-425.0.24捆绑包,测试文件: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. 苹果的版本似乎是基于旧版本的 CLANG,如果你运行clang --help,这个版本的 sanitizers 都是这种形式。

于 2013-04-21T11:10:38.500 回答