問題タブ [address-sanitizer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
100 参照

c++ - 関数によって宣言された配列サイズはスタックの破損につながりますが、コンパイルはクリーンですか?

これは、元のソース コードから抽出したコード サンプルです。コンパイルは正常に行われますが、ほぼランダムにクラッシュします。

GDB と Address Sanitizer ツールを使用したいくつかのデバッグ セッションの後、次のことがわかりました。

スタックの破損の原因は 1 つです。

p が実行時にインスタンス化され、配列サイズの宣言がコンパイル時に固定値で行われることを知っている場合、これはどのように文句なしにコンパイルされるのでしょうか? コンパイル時の p->f() の値は?

また、memset (「未定」配列サイズの余分な 10 バイトの書き込み) がセグメンテーション違反なしで実行されるのはなぜですか?

0 投票する
2 に答える
1449 参照

python - Python ネイティブ モジュールのサニタイザー

ネイティブ モジュールに GCC のサニタイザーを使用したいと考えています。

リンクオプションを使用します:

ネイティブ モジュールをロードすると、エラー メッセージが出力されます。

これは、静的フラグが機能していないようです。共有オブジェクトのみにサニタイザーを使用することは可能ですか、またはサニタイザーを python3 に直接リンクする必要がありますか?

0 投票する
2 に答える
1444 参照

c++ - アドレス サニタイザーと追加の asan フラグを静的な初期化順序に使用すると、g++ 5 および 6 でエラーが発生する

私のライブラリdoctestは、travis CI - x86/x64 Debug/Release linux/osx 上の 200 以上のビルドと、gcc 4.4 から 6 および clang 3.4 から 3.8 までの幅広いコンパイラでテストされています。

すべてのテストは、valgrind とアドレス サニタイザー (UB サニタイザー) を介して実行されます。

私は最近、ASAN のすべての機能がデフォルトでオンになっているわけではないことを発見しました。たとえば、次のとおりです。

  • check_initialization_order=true
  • detect_stack_use_after_return=true
  • strict_init_order=true

そのため、それらを有効にすると、以下の例のようなコードでエラーが発生し始めました。

でコンパイルg++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010:

g++ -fsanitize=address -g -fno-omit-frame-pointer -O2 a.cpp

そして次のように走りました:

ASAN_OPTIONS=verbosity=0:strict_string_checks=true:detect_odr_violation=2:check_initialization_order=true:detect_stack_use_after_return=true:strict_init_order=true ./a.out

次のエラーが発生します。

同じですg++-6 (Ubuntu 6.1.1-3ubuntu11~12.04.1) 6.1.1 20160511

次の 3 つのいずれかを実行すると、エラーは消えます。

  • g++ の代わりに clang++ (任意のバージョン) を使用する
  • を取り外して-O2使用-O0
  • staticの前を削除します。dummy

なぜこうなった?バグの場合 - 報告されていますか? それを避ける方法は?

編集:

@vadikrobot は、これでも次のように述べてstatic int data = 0; static int dummy = data; int main() { }います。問題が発生します。

編集:

@eadの答えは正しいですが、静的ダミーの削除を回避する方法を見つけたので、asanはもうアサートしません:

0 投票する
1 に答える
11766 参照

c++ - エラー: AddressSanitizer: pc Y bp Z sp W のアドレス X のヒープ バッファー オーバーフロー

私は動的メモリ管理にかなり慣れておらず、メモリ管理の問題を見つけるために Fsanitise フラグを使用しています。ベクトルを使用してデータを格納することはできません。ヒープ オブジェクトを管理するには、プリミティブ配列と「新規」および「削除」を使用する必要があります。

EuclideanVectorTester コンパイル済みプログラムを実行しようとすると、次のエラーが発生しましたが、何が問題なのかわかりません。誰か教えてください。

EuclideanVector.h ファイルは次のとおりです。

EuclideanVector.cpp ファイルは次のとおりです。

EuclideanVectorTester.cpp ファイルは次のとおりです。

0 投票する
0 に答える
343 参照

c++ - libasan が time_t time (time_t *__timer) 内に stack-buffer-overflow を与える -> sys/time.h

私が書いたいくつかのコードを改善するために libasan を使用しているときに問題に直面しています。

状況:

-- -fsanitize=address -lasan を使用してコードをコンパイルします。

-- コードを実行します。

以下のサンプル:

問題: このコードはサンプル プログラムでは問題なく動作しますが、アプリケーションでは失敗します。エラー スタック トレースでアプリケーションがクラッシュします。

さて、これは上に投稿したコードが原因ではないことを理解していますが、現在理解していないのは、スタックポインターを台無しにしている場所を見つける方法です..

どんな助けでも感謝します。

0 投票する
3 に答える
1302 参照

c++ - UBSAN が clang または gcc を使用してコンパイルされているかどうかを確認するにはどうすればよいですか?

次のコードを使用して-fsanitize=address、clang と gcc のコンパイル時に が指定されているかどうかを判断します。が指定されているかどうかをどのように判断し-fsanitize=undefinedますか?