TSAは、Clangの静的分析ツールです。
POSIXスレッドAPIを使用しているソースコードに注釈(属性)を追加し、でコンパイルすることにより
clang -Wthread-safety
ソースコードは、データレースやデッドロック、あるいはその両方につながる安全でないロックパターンについて、コンパイル時間で分析されます。
TSAの公式文書はです
https://clang.llvm.org/docs/threadsafetyanalysis.html
そのページはC ++でTSAの使用についてのみ語っていますが、Plane Cでほとんどの機能を使用することは非常に可能です。
それが実際、このリポジトリが存在する理由です。
tsa.hをコードに含めます。pthread_mutex_tの代わりにtsa_mutexを使用します。clang -Wthread-safetyでコンパイルします。使用する例と発行によって引き起こされるエラーを確認できます
make
それぞれの例プログラムは、特定のタイプのエラーを示しています。
例えば:
tsa_mutex mut;
int g TSA_GUARDED_BY(&mut);
int main {
g = 1; // This would be bad.
}
問題を修正する方法を確認するには、問題です
make pass
プログラムの例を研究します。
#ifndef TSA_PASSの最初のブランチは間違った方法を示しています(これは「何もしない」かもしれません)、2番目のブランチである#elseは正しい方法を示しています。
TSAは、 Thread SanitizerやTsanと同じものではありません。
TSAは完全にコンパイル時間ですが、スレッドサニタイザーはコンパイラ出力に計装を追加して、実行時に実行中にデータレースを検出できるようにします。追加された計装により、いくつかの実行オーバーヘッドが追加され、かなりのメモリオーバーヘッドが追加されます。これはTSAでは起こりません。
私が知る限り、TSAはgccではなくclangのみで利用できます。 Clang 3.6以降、完全に利用できるはずです。
tsa.hはMITライセンスの下で配布されます。これは、Clang(LLVM)ライセンスと互換性があります:http://llvm.org/docs/developerpolicy.html#license
ライセンスはtsa.hにインラードされており、https://opensource.org/licenses/mitから直接別のファイルライセンスとして利用できます。
Perl 5プロジェクトなしでは、これを掘り下げなかったでしょう。 PERL 5のビルドモードの1つは、POSIXスレッドをサポートしてビルドすることであり、その論理を確認するために、ClangにはTSAがあることがわかりました。 Perl 5 Porters(Perl 5開発およびメンテナンスプロジェクト)は、Craig BerryとJerry Heddenに特別なおかげで、TSA C APIのテストに役立ちました。 Perl 5ソースコードのPerl.hの一部として、 tsa.hに非常によく似たものを見つけることができます。
Jarkko Hietaniemi <[email protected]>