27

Valgrind はこのプラットフォームでのメモリ チェックに問題があるため、OSX Mountain Lion で clang アドレス サニタイザーを使用したいと考えています。しかし-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 コードは、スタックおよびヒープ バッファ オーバーランや解放後使用の問題などのメモリ破損の問題の影響を受けやすくなっています。これらのメモリ違反が発生すると、アプリが予期せずクラッシュしたり、奇妙な動作を示したりする可能性があります。メモリ破損の問題は、クラッシュや異常な動作を再現するのが難しいことが多く、原因が問題の原因から遠く離れている可能性があるため、追跡するのが困難です。

アドレスサニタイザーを有効にする

ビルド スキームでアドレス サニタイザーを有効にします。有効にすると、追加のインストルメンテーションがアプリに組み込まれてメモリ違反を即座にキャッチし、問題が発生した場所で問題を検査できるようにします。問題のあるアドレスとヒープ上の有効なオブジェクトとの関係、割り当て/割り当て解除情報など、その他の診断情報も提供され、問題を特定して迅速に修正するのに役立ちます。

Address Sanitizer は効率的で、インタラクティブなアプリケーションだけでなく、定期的に使用するのに十分な速さです。OS X、シミュレータ、および iOS デバイスでサポートされています。

于 2015-06-17T20:57:27.897 に答える
6

ソースによると (特に、Apple の 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。Apple のバージョンは、古いバージョンの CLANG に基づいているようです。実行するclang --helpと、このバージョンのサニタイザーはすべてこの形式になります。

于 2013-04-21T11:10:38.500 に答える