【问题标题】:Clang Address Sanitizer on OS XOS X 上的 Clang 地址清理程序
【发布时间】:2013-04-14 08:33:02
【问题描述】:

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

【问题讨论】:

    标签: macos clang sanitizer address-sanitizer


    【解决方案1】:

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

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

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

    enableAddressSanitizer = "YES"
    

    来自New Features in Xcode 7 文档:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        根据来源(特别是如果您从Apple's Open Source Site 获取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,这个版本中的消毒剂都是这种形式。

        【讨论】:

        • 我也遇到了一个错误:clang: error: unsupported option '-faddress-sanitizer'。但是,在clang --help 我可以看到这个选项
        • @gaige:问题在于 Apple 正在部署一个 版本的 Clang,它仍然使用旧的 -faddress-sanitizer。较新的 -fsanitize=address 稍后加入,当时添加了其他消毒剂。
        • @0xC0000022L 抱歉,当我说“您需要从更新的来源构建自己的 clang”时,我以为我在上面说明了这一点。诚然,它没有明确说明 Apple 的版本较旧,但确实建议从较新的版本构建。我会更新语言以使其更清晰。
        • @gaige:我的主要观点是关于这句话出于某种原因,Apple 的版本似乎与 CLANG 文档中的内容有所不同,这似乎表明 Apple 的 Clang较新。无意冒犯,但这让我很困惑,我认为应该发表评论。
        • Xcode 5.1.1 说clang: error: argument '-faddress-sanitizer' is deprecated, use '-fsanitize=address' instead。但是,它似乎仍然不支持 fsanitize=address: clang: error: unsupported argument 'address' to option 'fsanitize='
        猜你喜欢
        • 2015-07-17
        • 2018-04-04
        • 1970-01-01
        • 2011-08-08
        • 2019-03-28
        • 2011-10-09
        • 2016-01-11
        • 2016-11-01
        相关资源
        最近更新 更多