0

Clang と MemorySanitizer を使用していますが、インライン アセンブリが原因で誤検知が発生しました。インライン アセンブリ コードは後で使用される一部のメモリを初期化しますが、MemorySanitizer はこれを初期化されていない値の使用と見なします。

誤検知をフィルタリングする小さな GDB スクリプトを作成しようとしています。__msan_warning_noreturn にブレークポイントを設定しました。これは、MemorySanitizer にエラーを出力して保釈する関数です。ただし、エラーを引き起こすアドレスを取得する簡単な方法が見つかりませんでした。

エラーを引き起こすアドレスを見つけるにはどうすればよいですか?

私はX64アーキテクチャ、Linux、clang-3.8に取り組んでいます

ありがとうございました。

4

1 に答える 1

0

インライン アセンブリ コードは後で使用される一部のメモリを初期化しますが、MemorySanitizer はこれを初期化されていない値の使用と見なします。

Memory Sanitizer は、C および C++ ソースを計測することによって機能します。インライン アセンブリをインストルメント化できない (そしてインストルメント化しない) ため、この初期化は認識されません。

誤検知をフィルタリングする小さな GDB スクリプトを作成しようとしています。

これはおそらく間違ったアプローチです。

代わりに、Memory Sanitizerブラックリストを使用するか、 __msan_unpoisonを呼び出して、特定のメモリ位置が初期化されたことを伝える必要があります。

于 2016-12-11T18:41:45.350 に答える