問題タブ [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.
gcc - ASAN/UBSAN レポート出力の設定方法
単体テスト スイートを実行して、-fsanitize=address,undefined
すべてのサニタイザー エラーをreport.txt
ファイルに書き込みたいと考えています。デフォルトでは、すべてのサニタイザー エラーが stdout に書き込まれますが、ソフトウェアは stdout にも情報を書き込むため、エラーの検出が困難になります。私は試した:
また、テストを実行する前に C API を呼び出してみました。
ただし、どちらも機能していないようで、すべてのエラーが標準出力に書き込まれます。私は Debian テストを使用しています:
単体テストのサニタイザー エラーをどこかに保存できる別の方法はありますか?
c++ - AddressSanitizer GCC 4.8 での Double Free エラー
次のおもちゃのプログラムを考えてみましょう( prog.cpp
):
これは正常にコンパイルされた場合 ( g++ prog.cpp -latomic
)、正常に動作します。ただし、コンパイルするとg++ -fsanitize=address -fno-omit-frame-pointer prog.cpp -latomic
、実行時に Double Free エラーが生成されます。上記と同様の行に基づくプログラムは、通常のコンパイルでも Double Free エラーが発生するマルチスレッド アプリケーションで使用する必要があります。Double Free の場合に一般的に参照される Rule of Three/Five やその他のさまざまなドキュメントを読みましたが、何も機能しませんでした。
noexcept
また、のデフォルトコンストラクタから指定子を削除するclass A
と、この奇妙なエラーが発生します。これについても知りたいです。
gcc - クラスメンバーはグローバル変数と重複しています
アプリケーションの動作不良に取り組んでいます... 最近 g++-4.1 を g++-4.8 にアップグレードしましたが、一部のクラス インスタンスのプライベート メンバーと、メイン ソースでグローバルに定義された一部の変数との間でメモリ オーバーラップが発生しています。 .
gdb で書き込みをトラップし、変数ポインタを調べると、それらが同じメモリ アドレスを共有していることがはっきりとわかります。
4.8 で導入された -fsanitize=address を有効にすると、同じことがわかります。
コードは非常に巨大で、問題を切り分けるためにコードの一部を切り取ろうとすると、重なっている領域が上に移動して消えてしまいます。
とにかく、すべてが静的に定義されており、ランタイムで定義されたインスタンスがないため、オーバーラップはコンパイラまたは gcclib の一種の間違いであると思います。または、同じアドレスに 2 つの異なるアイテムを割り当てる他の人が誰なのかわかりません。 . 問題は、この「バグ」の原因を追跡するために、他にどのような方法で調査し、より有用な情報を生成できるかということです。
c - gcc ASAN が実行時エラーとされるエラーで停止しない
アドレスサニタイザーが何かをキャッチしたときに中止したいと思います。デフォルトでそれを行うように設計されていると思いましたが、うまくいかないようです。効果のないものも試しASAN_OPTIONS=halt_on_error=1
ました。詳細は次のとおりです。
私が取り組んでいるプロジェクトでは、アドレスサニタイザーを使用していますが、誰も気付かないうちにこの警告/エラーが数週間発生しました。
実行時エラー: null ポインターが引数 xx として渡されましたが、null になることはないと宣言されています
実行時エラーと呼ばれても、プログラムを停止したり、不正な終了コードを引き起こしたりすることはありません。これを示す簡単なプログラムを次に示します。
argc のトリックは、gcc が memcpy 呼び出しを最適化しないようにするためのものです。基本的に、私たちのコードでmemcpy(dst, NULL, 0)
は、実行時エラー/警告の原因となります。
実行時エラーの後に「after」が出力されないことを期待しますが、出力され、プログラムの終了コードは 0 です。これはバグですか? 説明書には止めてくださいと書いてあります。
c++ - Address Sanitizer は、オプション -O を使用してメモリ リークを検出できません
Address Sanitizer(clang v3.4)を使用してメモリリークを検出すると、-O(-O0を除く)オプションを使用すると、常にリークが検出されない結果になることがわかりました。
コードは簡単です:
-O0 でコンパイルすると、
メモリを正しく検出し、
ただし、-O を追加すると、
何も検出されません!そして、私は公式文書でそれについて何も見つけません。
c++ - ASAN から new-delete-type-mismatch を取得する
を使用してコードをコンパイルしましたが、次の-fsanitize=address
エラーが発生しています。
コード例: