2013-04-21 6 views
27

Ich würde gerne Clam-Adresse Sanitizer auf OSX Mountain Lion verwenden, weil Valgrind Probleme mit Speicher überprüfen auf dieser Plattform haben. Aber , wenn ich die -fsanitize=address während der Kompilierung hatte (wie ich auf dieser Seite sehen: http://clang.llvm.org/docs/AddressSanitizer.html), habe ich diesen Fehler: clang: error: argument unused during compilation: '-fsanitize=address'Clang Adresse Sanitizer auf OS X

So ist meine Frage, wie Clang verwenden Adresse Sanitizer auf OS X? Wenn ich es nicht benutzen kann, welches Werkzeug kann ich benutzen?

Ich habe einen Download mit Xcode und es ist auf dem neuesten Stand. (Vielleicht ist diese Version Adresse nicht Sanitizer mit ihm bauen)

Antwort

6

Laut der Quelle (insbesondere, wenn Sie das clang-425.0.24 Bündel von Apple's Open Source Site greifen, die Testdatei src/tools/clang/test/Driver/darwin-asan-nofortify.c:

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

Und natürlich gibt ein Fehler ist -faddress-sanitizer verwendet wird, so sieht es aus wie unter OS X, müssen Sie bauen sich aus der jüngeren Quelle, um klirren die Adresse sanitizer zu erhalten.

Kommandozeilenoption

Versuchen Sie, -faddress-sanitizer anstelle von -fsanitize=address zu verwenden. Apples Version scheint auf einer älteren Version von CLANG zu basieren, und wenn Sie clang --help ausführen, sind die Desinfektionsmittel alle dieses Formular in dieser Version.

+4

ich auch einen Fehler bekam: 'Klirren: Fehler: nicht unterstützte Option '-faddress-sanitizer''. In "clang --help" kann ich jedoch diese Option sehen – Guillaume

+0

@gaige: Das Problem ist, dass Apple eine ** ältere ** Version von Clang, die den alten '-Faddress-Sanitizer' immer noch verwendet. Die neuere '-Fsanitize = Adresse 'kam später hinzu, als die anderen Desinfektionsmittel hinzugefügt wurden. – 0xC0000022L

+0

@ 0xC0000022L Entschuldigung, ich dachte, dass ich diesen Punkt oben erwähnte, als ich sagte: "Sie müssen sich selbst aus einer neueren Quelle zusammensetzen". Zugegebenermaßen heißt es nicht explizit, dass Apples Version älter ist, aber es schlägt vor, aus einer neueren Version zu bauen. Ich werde die Sprache aktualisieren, um es klarer zu machen. – gaige

12

Adresse Sanitizer als neues Feature in Xcode hinzugefügt wurde 7.

Verwenden Runtime Sanitization>Enable Address Sanitizer Flagge in Ihrem Schema die Option zu aktivieren.

git wird dann diese Änderung Ihrer .xcscheme Datei angezeigt:

enableAddressSanitizer = "YES" 

Vom New Features in Xcode 7 Dokument:

Address Sanitizer. Xcode 7 can build your app with instrumentation designed to catch and debug memory corruption using the address sanitizer.

Objective-C and C code is susceptible to memory corruption issues such as stack and heap buffer overruns and use-after-free issues. When these memory violations occur, your app can crash unpredictably or display odd behavior. Memory corruption issues are difficult to track down because the crashes and odd behavior are often hard to reproduce and the cause can be far from the origin of the problem.

Enable Address Sanitizer

You enable the address sanitizer in the build scheme. Once enabled, added instrumentation is built into the app to catch memory violations immediately, enabling you to inspect the problem right at the place where it occurs. Other diagnostic information is provided as well, such as the relationship between the faulty address and a valid object on the heap and allocation/deallocation information, which helps you pinpoint and fix the problem quickly.

Address sanitizer is efficient—fast enough to be used regularly, as well as with interactive applications. It is supported on OS X, in the Simulator, and on iOS devices.