2016-05-01 7 views
10

Clangには、実行時に問題を捕捉するためにオンにできるさまざまな消毒剤があります。
しかし、一緒に使うことができない消毒剤がいくつかあります。何故ですか?すべてのサニタイザを有効にすることができないのはなぜですか?

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' 

それは大したことではないのですが、私は私のユニットテストを実行したときに、私は同じテストのための複数のバイナリを作成し、それらを別々に実行してきたので、それは、もはやそれが必要よりも時間がかかります。

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

私の推測では、計測器の一部は互換性がないと考えられます。 1つの消毒剤の計量は、他の1つに偽陽性または偽陰性をもたらす。しかし、私は技術的な詳細にも非常に興味があります。 – MikeMB

+1

"ユニットテストを実行すると、" -O "を使用していないように見えます。 '-O1'はメモリサニタイザで安全に使うことができ、スタックトレースを壊さない(テールコールとは別に) – viraptor

+0

@viraptorありがとう、それは良い点です。私は実際のコンパイル時間も指していました。複数のバイナリをビルドして、同じソフトウェアコンポーネントをテストします。 –

答えて

2

私はこの問題は、牙山とMSANの両方がヒープを制御したいということだと思う、との両方が、メモリの割り当てと使用状況を追跡する「シャドウメモリ」として使用するために大量のメモリを予約したいあなたプログラム使用。

他のサニタイザが使用しているメモリ(サニタイザがチェックするルールに従って「安全」ではないように見えるかもしれない)を追跡しようとしているため、両方をアクティブにすることはできません。

また、両方のサニタイザーがプログラムで使用するすべてのバイトを追跡するために追加のメモリを割り当てるため、メモリが狂ってしまうこともあります。

理論的には、共通のフレームワークを共有するように再設計して、協力して衝突しないようにすることは可能かもしれませんが、それが難しいか、パフォーマンスを損なう可能性が非常に高い実用的な理由があります。

関連する問題