問題タブ [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.
c - 変更されていないローカルのアドレスが setjmp/longjmp で破損する可能性はありますか?
setjmp/longjmp (don't ask)を使用して行き詰まる状況に陥った場合、何か間違ったことをしている可能性があるときに、コンパイラから多くの適切な警告が表示されます。
しかし、Clang でAddress Sanitizer-Wall -Wextra -pedantic
を使用している間にビルドを行ったところ、次のようなケースに遭遇しました。
longjmp で、スタック フレームを調べるとhelper
、エラー ポインタが null です。フレームを見ると、outer()
エラーが「最適化されています」と表示されます。
でコンパイルしているので不可解です。-O0
したがって、「最適化された」というのは奇妙です。しかし、ほとんどのものlongjmp-yと同様に、コンパイラがエラーアドレスを事前にどのレジスタに入れるかを決定する可能性を妨げているのは何なのだろうか...そしてそれを無効にする.
アドレスサニタイザーが私をパンクさせていますか、それとも実際に次のようなものを書く必要がありますか?
これを調べているとjmp_buf
、どの例でも s がローカルではないことに気付きました。それはあなたができないことですか?:-/
注:コンストラクトに関する「言語弁護士」の問題については、@ AnT の回答と以下のコメントを参照してくださいsetjmp() ? ... : ...
。しかし、ここで私が実際に行っていたのは、関数が終了した後の壊れた longjmp 呼び出しであることが判明しました。ドキュメント(また、常識)によると、それはlongjmp()
間違いなく壊れています。私はそれが起こったことに気づかなかった:
setjmp を呼び出した関数が終了した場合、動作は未定義です (つまり、コール スタックの長いジャンプのみが許可されます)。
c - gdb で UBSan レポートを中断して続行するにはどうすればよいですか?
-fsanitize=undefined
GCC および Clang の最近のバージョンは、ランタイム インストルメンテーション コードを追加するコンパイル フラグ ( ) である Undefined Behavior Sanitizer (UBSan) を備えています。エラーが発生すると、次のような警告が表示されます。
packet-ber.c:1917:23: ランタイム エラー: 54645397829836991 の 8 桁の左シフトは、タイプ 'long int' で表すことができません
これをデバッグして、上記の行でデバッグ ブレークを取得したいと思います。Address Sanitizer (ASAN) にはASAN_OPTIONS=abort_on_error=1
、キャッチ可能な致命的なエラーが発生するものがあります。使用可能と思われる唯一の UBSan オプションはUBSAN_OPTIONS=print_stacktrace=1
、レポートのコール トレース ダンプを生成するオプションです。ただし、これではローカル変数を調べてからプログラムを続行することはできません。そのためご利用-fsanitize-undefined-trap-on-error
いただけません。
UBSan レポートで gdb を中断するにはどうすればよいですか? 機能しているbreak __sanitizer::SharedPrintfCode
ように見えますが、名前はかなり内部的に見えます。
c++ - MinGW-w64 の gcc と Address Sanitizer
MinGW-w64 5.1 のインストールが利用可能であることがわかり-fsanitize=address
ました。それは問題なくコンパイルされ、リンクを開始すると、何千もの次のものが得られます。
libasan がさまざまな場所を参照していることがわかりましたが、含める-fsanitize=address
とリンク用にそのライブラリが自動的に含まれるというコメントもありました。MinGW-w64 5.1 のインストール ディレクトリで「asan」を検索しましたが、どこにも見つかりませんでした。
MinGW-w64 でアドレス サニタイズ機能を使用するには、何を追加する必要がありますか? ありがとうございました。
c - コンパイル時に Leak Sanitizer が有効になっているかどうかを知るにはどうすればよいですか?
GCC コンパイラと Clang コンパイラはどちらも、C プログラムのメモリ リークを検出するのに役立つLeakSanitizerをサポートしています。メモリ リークが避けられない場合があります (たとえば、テスト スイートでテストされているため)。
このようなメモリには、Leak Sanitizer インターフェイスを使用して注釈を付けることができます。
ただし、これは LSan をサポートしないコンパイラでは機能しません。Address Sanitizer では、この構成を使用して ASAN の可用性を検出できます。
__has_feature(leak_sanitizer)
Clang の LSan の存在だけを検出することはできず、GCC にも存在しません__SANITIZE_LEAKS__
。とにかく、ASAN の可用性を検出するにはどうすればよいですか? LSan は、AddressSanitizer および ThreadSanitizer とは別に有効にできることに注意してください。
gcc - gcc 4.7 で asan を使用する方法はありますか
address-sanitizer のホームページによると、gcc 4.8 以降にのみ付属しています。とにかくgcc 4.7でそれを使用することはありませんか?
xcode - XcodeでClang Address Sanitizerを有効にするにはどうすればよいですか?
WWDC 2015 で発表されたように、Clang Address Sanitizer が Xcode と OS X に導入されます。
セッション 413: 高度なデバッグとアドレス サニタイザー
Xcode プロジェクトで Clang Address Sanitizer を有効にするにはどうすればよいですか?
clang - Xcode 7 で「アドレスサニタイザーを有効にする」が無効になっているのはなぜですか?
新しい Xcode 7 のApple ドキュメントでランタイム サニタイズについて読んだので、それを探したところ、無効になっていることがわかりました。Xcode 7 GM シードを使用しています。
スキームの [実行] アクション > [診断] タブに移動すると、Enable Address Sanitizer
オプションが無効になります。
他のオプションがどのように無効化されるかについてはいくつかの説明がありますが、サニタイズ オプションが無効化される理由については言及されていません。
一部の診断ツールは、他のツールと組み合わせて使用できます。[診断] ペインで使用できるオプションは、オプションの組み合わせを選択するのに役立つさまざまなオプションが選択されているため、有効または無効になっています。たとえば、アドレスサニタイザーを有効にすると、互換性のないその他のツールが無効になり、選択できなくなります
AddresssanitizerのClang 3.8 ドキュメントを見ると、フラグを追加して有効にすることもできるようです: -fsanitize=address
。しかし、ビルド設定でこのフラグを使用する場所は謎であり、スキームのチェックボックスオプションとしても存在するため、疑問があります。
this SO answerも見つかりましたが、2013年に戻ったため、かなり複雑で、おそらく時代遅れです。