問題タブ [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++ - Address Sanitizer スレッドの制限を超えました
-fsanitize=address オプションを指定して gcc 6.1 でコンパイルされたプログラムをプロファイリングしています。このプログラムは、スレッドごとにクリーンな終了 (pthread_exit を使用) を備えたマルチスレッド化されています。
Address Sanitizer は次のメッセージで失敗します: ==16800==AddressSanitizer: スレッド制限 (4194304 スレッド) を超えました。死んでいる。
スレッド数は意味がありません (それほど多くのスレッドを割り当てる方法はありません)。スレッドがどこでどのように作成されているかを確認するために AddressSanitizer を計測する方法はありますか?
c++ - -GCC-6.1 でゴールド リンカーを使用しない fsanitize
更新 (2016 年 9 月 30 日)
gcc-6.2 の Ubuntu ビルド ((Ubuntu 6.2.0-3ubuntu11~16.04) 6.2.0 20160901) では、この問題はなくなりました。
gcc-6.1[1] ((Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511)、GNU binutils 2.24、および GLIBCXX_3.4.22 をサポートする libstdc++ の Ubuntu ビルドを使用しています。単純な「hello world」プログラムであっても、サニタイザーを指定してもゴールド リンカーの使用は強制されません。
main.cpp
コンパイルとリンク
エラーを与える
これは、-fsanitize
オプションがゴールド リンカーを選択していないことを示しています。もちろん、簡単な修正は-fuse-ld=gold
リンク中に使用することですが、gcc の以前のビルドでは、サニタイザーを使用するときにこれは必要ありませんでした。たとえば、このコードは gcc-5.3 および 4.9 (どちらも Ubuntu ビルド) で問題なく動作します。gcc-6.1 の Ubuntu 以外のビルドでこの問題を抱えている人は他にいますか? Ubuntu ビルドは壊れていますか?
[1] 以下のフラグでビルド (gcc-5.3 と gcc-4.9 は、名前とサフィックスの違いのみでビルドされました)
gcc - GCC で AddressSanitizer を使用するには?
私は自分のプロジェクトを構築しようとしています
しかし、次のような多くのエラーが発生します。
AddressSanitize サポートを使用してプロジェクトをコンパイルするには?
私の gcc バージョンは 4.8.4 です。
c++ - AddressSanitizer の出力を解釈する方法は?
AddressSanitizer が検出されたようですが、ここheap-buffer-overflow
の例のように出力が明確ではありません。
オーバーフローが発生した行を取得するにはどうすればよいですか?
この結果をどのように解釈できますか?
ubuntu - ASAN_SYMBOLIZER_PATH がバージョン修飾バイナリで機能しなくなったのはなぜですか
Ubuntu 14.10 では、llvm-symbolizer
プログラムは としてインストールされ/usr/bin/llvm-symbolizer-3.5
ます。通常、アドレス サニタイザーはllvm-symbolizer
inという名前のバイナリを探しますPATH
。ただし、回避策として、明示的に設定することが可能でしたASAN_SYMBOLIZER_PATH
。そのため、環境で設定ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.5
すると、アドレスサニタイザーがインストルメント化されたプログラムが記号化されたエラーを出力できるようになります。
Ubuntu 16.04 では、llvm-symbolizer
プログラムはバージョン サフィックスを付けて再度インストールされ、現在は/usr/bin/llvm-symbolizer-3.8
. ただし、ASAN_SYMBOLIZER_PATH
設定が機能しなくなったようです。環境で set を使用して ASAN インストルメント化プログラムを実行すると、ASANASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.8
がエラーを検出したときに次のエラーが生成されます。
この動作が変更された理由、または古い動作を復元する方法を知っている人はいますか? これは不当に制限されているようです。私が ASAN に指摘したシンボライザー プログラムは間違いなく既知のシンボライザーであり、最後に Ubuntu の強制バージョン タグがたまたまあるだけです。
Ubuntu はバージョン装飾のないバイナリをPATH
出荷しないため、ここでは調整は役に立たないことに注意してください。llvm-symbolizer
c++ - アドレスサニタイザーは Windows 上の bash では機能しません
現在、Windows 上の Ubuntu Bash で llvm、clang、clang-format、clang-modernize を実行しています。アドレス、メモリ、スレッド サニタイズなど、Google がリリースしたサニタイズ ツール セットを使用したいと考えています。fsanitize オプションはどれも機能していないようです。
ASAN のコード サンプルは次のとおりです。
Windows 上の bash での clang 呼び出しは次のとおりです。
結果
それを機能させる方法、またはツールチェーンの一部が欠けているかどうかについての提案が欲しいです。
Windows用のclangにはstd:outサポートなどの単純な機能がないため、UbuntuまたはDebianをデュアルブートすると思いますが、理想的にはWindowsターゲットとLinuxターゲットの両方でコンパイルできるようにしたいと思います。UbuntuはWindowsストレージスペースをマウントできないため、デュアルブートは避けたいと思いますが、Windows上のUbuntu bashにはうまく提供されているようです。
c++ - GCC でコンテナ オーバーフロー バグ検出を使用するには?
EuroLLVM 2014 では、Kostya Serebryany がベクトル オーバーフロー検出の方法を発表しました。スライド 12 で、彼はGCC リビジョン 207517へのリンクを示していますbranches/google/gcc-4_8/libstdc++-v3/
。
コンテナ オーバーフロー バグ検出を使用できる GCC のバージョンを教えてください。トランクにのみある場合、Clang 3.9 リリースで利用可能ですか、それともトランクにありますか?