TSA adalah alat analisis statis untuk dentang.
Dengan menambahkan anotasi (atribut) ke kode sumber yang menggunakan API utas POSIX, dan dikompilasi dengan
clang -Wthread-safety
Kode sumber dianalisis dalam waktu kompilasi untuk pola penguncian yang tidak aman yang akan mengarah ke balapan data atau kebuntuan, atau keduanya.
Dokumentasi resmi untuk TSA adalah
https://lat.llvm.org/docs/threadsafetyanalysis.html
Sementara halaman itu hanya berbicara tentang menggunakan TSA dengan C ++, sangat mungkin untuk menggunakan sebagian besar fungsi dengan Plain C.
Faktanya, mengapa repositori ini ada.
tsa.h ke dalam kode Anda di mana Anda menggunakan mutex POSIX untuk mengoordinasikan akses utas POSIX ke data.tsa_mutex bukan pthread_mutex_t .clang -Wthread-safety .Anda dapat melihat penggunaan contoh dan kesalahan yang disebabkan oleh penerbitan
make
Masing -masing contoh program menunjukkan satu jenis kesalahan tertentu.
Misalnya:
tsa_mutex mut;
int g TSA_GUARDED_BY(&mut);
int main {
g = 1; // This would be bad.
}
Untuk melihat cara memperbaiki masalah, masalah
make pass
dan mempelajari contoh program.
Cabang pertama dari #ifndef TSA_PASS menunjukkan cara yang salah (yang mungkin: "tidak melakukan apa -apa"), sedangkan cabang kedua, #else , menunjukkan cara yang benar.
TSA tidak sama dengan pembersih utas atau tsan .
TSA sepenuhnya kompilasi-waktu, sedangkan pembersih utas menambahkan instrumentasi ke output kompiler sehingga runtime dapat mendeteksi balapan data selama eksekusi. Instrumentasi yang ditambahkan menambahkan beberapa eksekusi overhead, dan overhead memori yang cukup besar. Semua ini tidak terjadi dengan TSA.
Sejauh yang saya tahu TSA hanya tersedia untuk clang , bukan gcc . Itu harus sepenuhnya tersedia sejak dentang 3.6.
tsa.h didistribusikan di bawah lisensi MIT, yang kompatibel dengan lisensi dentang (llvm): http://llvm.org/docs/develeverpolicy.html#license
Lisensi tersebut dilapisi dengan tsa.h , dan tersedia sebagai lisensi file terpisah, langsung dari https://opensource.org/licenses/mit
Saya tidak akan mempelajari ini tanpa proyek Perl 5. Salah satu mode build dari Perl 5 adalah membangun dengan dukungan untuk utas POSIX, dan untuk memeriksa logika itu, saya mengetahui bahwa dentang memiliki TSA. Perl 5 Porters (Proyek Pengembangan dan Pemeliharaan Perl 5) membantu dalam menguji API TSA C, terima kasih khusus kepada Craig Berry dan Jerry Hedden. Anda akan menemukan sesuatu yang sangat mirip dengan tsa.h sebagai bagian dari Perl.h dalam kode sumber Perl 5, milik saya.
Jarkko Hietaniemi <[email protected]>