スレッドサニタイザは、サプレッションファイルを使用して、コード外のライブラリで検出された問題のレポートを選択的にオフにすることができます。 Xcodeの持つこれらを使用するには、まずTSan.supp
(または類似した何かを)という名前のファイルを作成し、次のようにそれに行を置く:
mutex:Purge
mutex:ProcessBulkInData
mutex:EventDestroy
私は特定のライブラリ内のいくつかの内部関数で悪いミューテックスの問題に遭遇した
ので、私は、Thread Sanitizerスタックトレースに現れた関数名から部分文字列を提供することによって、mutexの警告(上記のmutex:
の一部)を抑制しました。
抑制ファイルを作成したら、Xcodeで実行計画を編集して、[引数]タブに移動します。環境変数で、TSAN_OPTIONS
という名前を付けて、suppressions=[path_to_TSan.supp]
という値を付けます。パスは、派生データの場所にあるアプリケーションのバイナリファイルとの相対パスである必要があります。
スレッド・サニタイザーを数回実行し、抑止ファイルを編集して、抑止するライブラリーの各項目を追加する必要があります。
この抑制ファイルのファイル形式とその他のオプションは、this wiki pageにあります。後世のために、これらは
スレッドです:スレッドに関連するレポート(リーク)
ミューテックスを抑制します。ミューテックスに関連するレポート(ロックされたミューテックスの破壊)
信号を抑制します:シグナルハンドラに関連するレポートを抑制する(ハンドラ呼び出しmalloc())
デッドロック:ロック反転が
called_from_libをレポート抑制:
おかげで、最近のバグ報告に応答して、このプロセスを説明した匿名のアップルのエンジニアに行く特定のライブラリ内のすべてのインターセプタを抑制することができます。
ここでは2つのケースがあります。 1)Thread Sanitizerは無駄な警告のスタックを生成します。この場合、ツールは投げられるべきです。または2)警告が実際の場合、2つのケースがもう1つあります。2a)適切なミューテックスを置くことができます。そうする必要があります.2)*この場合、ベンダーがそれを修正しない場合はライブラリを投げる必要があります*。あなたが守れないライブラリの競合条件は、ライブラリがマルチスレッドコードにはまったく適合しないことを意味します。 – Joshua
競合状態または潜在的なヒープ破損の問題は、ライブラリを置き換えることができないため無視しないでください。そういうわけで、まったくの狂気があります。 – Joshua