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]>