2016-12-11 9 views
0

私はClang & MemorySanitizerを使用しており、インラインアセンブリーのために誤検知が多少あります。 インラインアセンブリコードは、後で使用されるメモリを初期化しますが、MemorySanitizerはこれを初期化されていない値の使用とみなします。GDBでは、Clang&MemorySanitizerを使用して、エラーを引き起こすアドレスを取得する方法はありますか?

偽陽性をフィルタリングするための小さなGDBスクリプトを作成しようとしています。 MemorySanitizerとbailsにエラーを出力する関数である__msan_warning_noreturnにブレークポイントを設定します。しかし、私はエラーをトリガするアドレスを取得する簡単な方法を見つけることができませんでした。

エラーを引き起こすアドレスはどのようにして見つけることができますか?

私は、x64アーキテクチャ上でLinuxを働いて、打ち鳴らす-3.8

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

答えて

0

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

Memory Sanitizerは、CおよびC++ソースをインストルメントすることによって動作します。これは、インラインアセンブリーをインスツルメントすることはできません(また、インラインアセンブリーを作成することもできません)。

偽陽性をフィルタリングするための小さなGDBスクリプトを作成しようとしています。

これは間違ったアプローチです。

代わりに、特定のメモリ位置が初期化されていることをにそれを伝える__msan_unpoisonを呼び出して、いっそblacklist消毒剤のメモリを使用するか、または必要があります。

+0

ありがとうございました。 GDBで 私はコードを初期化するのasm命令のアドレスを発見し、このブレークポイントを作成しました: サイレント コール__msan_unpoisonコマンド 'ブレーク*アドレス($のRSIを、8) は end'を続けます –

関連する問題