TSA是Clang的靜態分析工具。
通過將註釋(屬性)添加到使用Posix threads api的源代碼中,並與
clang -Wthread-safety
源代碼以編譯時間進行分析,以獲取不安全的鎖定模式,這些模式將導致數據競賽或僵局,或兩者兼而有之。
TSA的官方文件是
https://clang.llvm.org/docs/threadsafetyanalysis.html
儘管該頁面僅談論與C ++一起使用TSA,但很有可能將大多數功能與普通C一起使用。
實際上,這就是為什麼存在此存儲庫的原因。
tsa.h包括在您的代碼中,在其中您使用posix mutexes來協調Posix Threads對數據的訪問。tsa_mutex代替pthread_mutex_t 。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的第一個分支顯示錯誤的方式(可能是:“無所事事”),而第二個分支#else則顯示正確的方式。
TSA與線程消毒劑或TSAN不同。
TSA是完全編譯的時間,而線程消毒器將儀器添加到編譯器輸出中,以便運行時可以在執行過程中檢測數據競賽。添加的儀器添加了一些執行開銷,並且內存相當大。 TSA都沒有發生。
據我所知,TSA僅適用於clang ,而不是gcc 。由於Clang 3.6,它應該完全可用。
tsa.h是根據MIT許可分配的,該許可與Clang(LLVM)許可證兼容:http://llvm.org/docs/developererpolicy.html#license
該許可證均為tsa.h ,並直接從https://opensource.org/licenses/mit直接作為單獨的文件許可證可用
沒有Perl 5項目,我不會深入研究。 Perl 5的構建模式之一是在支持Posix線程的情況下構建,並檢查其邏輯,我發現Clang具有TSA。 Perl 5搬運工(Perl 5開發和維護項目)有助於測試TSA C API,特別感謝Craig Berry和Jerry Hedden。您會發現像perl 5源代碼中的perl.h的一部分一樣,您會發現類似於tsa.h的東西。
Jarkko Hietaniemi <[email protected]>