2016-05-01 6 views
10

Clang hat verschiedene Sanitizer, die eingeschaltet werden können, um Probleme zur Laufzeit zu erfassen.
Allerdings gibt es einige Desinfektionsmittel, die ich nicht zusammen verwenden kann. Warum das?Warum können alle Sanitizer nicht durch Klon aktiviert werden?

clang++-3.9 -std=c++1z -g -fsanitize=memory -fsanitize=address -o main main.cpp                     1 
clang: error: invalid argument '-fsanitize=address' not allowed with '-fsanitize=memory' 

Es ist keine große Sache, aber wenn ich meine Unit-Tests laufen, dauert es länger, als es sollte, weil ich jeden von ihnen getrennt mehrere Binärdateien für den gleichen Tests erstellen müssen, und ausführen.

clang++-3.9 -std=c++1z -g -fsanitize=address -o test1 test.cpp 
clang++-3.9 -std=c++1z -g -fsanitize=memory -fsanitize=undefined -o test2 test.cpp 
+1

Meine Vermutung wäre, dass einige der Instrumente einfach nicht kompatibel sind - z. Die Instrumentierung eines Desinfektionsmittels würde im anderen zu falsch positiven oder falsch negativen Ergebnissen führen. Aber ich würde mich auch sehr für die technischen Details interessieren. – MikeMB

+1

"Wenn ich meine Komponententests ausführen, dauert es länger als es sollte" -> es sieht so aus, als ob Sie nicht "-O" verwenden. '-O1' ist sicher zu verwenden mit Speicher Desinfektionsmittel und wird Stacktraces (abgesehen von Schwanz-Anrufe) nicht korrumpieren – viraptor

+0

@viraptor Danke, das ist ein guter Punkt. Ich habe mich auch auf die eigentliche Kompilierungszeit bezogen. Erstellen mehrerer Binärdateien zum Testen derselben Softwarekomponenten –

Antwort

2

Ich denke, das Problem ist, dass Asan und MSAN beide wollen den Haufen kontrollieren, und beide wollen eine große Menge an Speicher reservieren als „Schattenspeicher“ verwendet werden, die die Zuweisungen und die Verwendung der Speicher verfolgt Ihre Programm verwendet.

Sie können nicht beide aktiv sein, da sie versuchen würden, den Speicher zu verfolgen, der von dem anderen Desinfektionsmittel verwendet wird (was gemäß den Regeln, die der Desinfizierer überprüft, nicht "sicher" zu sein scheint).

Es würde auch in verrückten Speicherverbrauch führen, weil beide Desinfektoren zusätzlichen Speicher zuweisen würden, um jedes Byte zu verfolgen, das Ihr Programm verwendet.

Vielleicht in der Theorie könnte sie neu entwickelt werden, um einen gemeinsamen Rahmen zu teilen, so dass sie zusammenarbeiten können und nicht zusammenstoßen, aber es gibt wahrscheinlich sehr gute praktische Gründe, warum das schwierig wäre, oder Leistung zu verletzen.

Verwandte Themen