問題タブ [memory-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++ - AddressSanitizer と MemorySanitizer を実際に使用するにはどうすればよいですか?
AddressSanitizer と MemorySanitizer は非常に便利なツールですが、プログラム全体を適切にインストルメント化する必要があります。(少なくとも、AddressSanitizer の Clang バージョンについては、MemorySanitizer ドキュメントのhereと、 AddressSanitizerClangVsGCCの「グローバルにプライベート エイリアスを使用する」セクションを参照してください。)
つまり、ASan または MSan を有効にするには、すべてのライブラリ依存関係を適切なコンパイラ フラグを使用してビルドする必要があります。さまざまなサードパーティの依存関係を必要とする典型的な Linux アプリケーションの場合、これを行う実際的な方法は何ですか? Sanitizers は明らかに Google プロジェクトであり、Google コードはほとんど独自の monorepo と独自のビルド ツールを使用しているだけの印象を受けますが、これは平均的な開発者の手の届かないところにある可能性があります。多くの余分なインフラストラクチャやビルド スクリプトに投資することなく、Sanitizers を使用してライブラリをビルドする簡単な方法はありますか?
c++ - メモリ サニタイザー エラー: パディング バイトを含む構造体の clang5 + msan + fwrite
最小の例:
msan の 5 番目のバージョン以降の clang は、次のように報告します。
これは、Field1_
との間のパディング バイトField2_
が初期化されていないためです。
大丈夫です、MSANは正しいです。
しかし、コードにそのようなコード (構造体をバイナリ ファイルに保存する) の非常に大きな例が含まれている場合、コードを大幅に改善する美しい方法はありますか?
(パックされた構造体は解決策ではありません。)
cmake - compile-rt のみ (libgcc なし) に対してリンクするメモリ サニタイザー インストルメント化された libc++ をビルドできませんか?
llvm ツールチェーン (libc++、libunwind、compiler-rt、clang ...) を使用して、コード リポジトリで c++ メモリ サニタイザー (msan) を使用したいと考えています。したがって、最初に行う必要があるのは、msan-instrumented libc++ をビルドすることです。
MemorySanitizerLibcxxHowToから、オプション-DLLVM_USE_SANITIZER=Memory
orを指定して libc++ をビルドする必要があります-DLLVM_USE_SANITIZER=MemoryWithOrigin
。
完全なllvmツールチェーンの組み立てから、LLVM’s compiler runtime library
セクションで
libc++ および/または libc++abi を使用している場合は、-DLIBCXX_USE_COMPILER_RT=YES および/または -DLIBCXXABI_USE_COMPILER_RT=YES を cmake に渡して、libgcc_s ではなく compiler-rt を使用するように構成する必要がある場合があります。そうしないと、両方のランタイム ライブラリがプログラムにリンクされてしまう可能性があります (これは通常、無害ですが、無駄です)。
私は完全なllvmツールチェーンを目指しているので、追加する必要があると思い-DLIBCXX_USE_COMPILER_RT=YES
ます-DLIBCXXABI_USE_COMPILER_RT=YES
そこで、以下のスクリプトを使用して libcxx と libcxxabi をダウンロードし、予想されるディレクトリ レイアウトを作成してビルドを実行します。
私が得るエラーは次のとおりです。
-DLLVM_USE_SANITIZER=Memory
このエラーは、-DLIBCXX_USE_COMPILER_RT=YES
両方が存在する場合にのみ発生します。それらのいずれかを削除すると、問題が解決します。
問題を修正し、両方のオプション (msan とコンパイラ rt) を維持する方法はありますか? 前もって感謝します!