La TSA est un outil d'analyse statique pour Clang.
En ajoutant des annotations (attributs) au code source qui utilise l'API POSIX Threads et en compilant avec
clang -Wthread-safety
Le code source est analysé en temps de compilation pour les modèles de verrouillage dangereux qui mèneraient à des races de données ou à des blocs de blocage, ou aux deux.
La documentation officielle de la TSA est
https://clang.llvm.org/docs/threadsafetyanalysis.html
Bien que cette page ne parle que de l'utilisation de TSA avec C ++, il est tout à fait possible d'utiliser la plupart des fonctionnalités avec Plain C.
C'est, en fait, pourquoi ce référentiel existe.
tsa.h dans votre code où vous utilisez Posix Mutexes pour coordonner l'accès des threads POSIX aux données.tsa_mutex au lieu de pthread_mutex_t .clang -Wthread-safety .Vous pouvez voir l'exemple d'utilisation et les erreurs causées par l'émission
make
Chacun des exemples de programmes démontre un type particulier d'erreur.
Par exemple:
tsa_mutex mut;
int g TSA_GUARDED_BY(&mut);
int main {
g = 1; // This would be bad.
}
Pour voir comment résoudre les problèmes, émettez
make pass
et étudier les exemples de programmes.
La première branche du #ifndef TSA_PASS montre le mauvais sens (qui peut être: "ne rien faire"), tandis que la deuxième branche, le #else , montre la bonne façon.
La TSA n'est pas la même chose que le désinfectant en fil ou le TSAN .
La TSA est complètement compilée, tandis que le désinfectant du thread ajoute une instrumentation à la sortie du compilateur afin que le temps d'exécution puisse détecter les courses de données pendant l'exécution. L'instrumentation ajoutée ajoute des frais généraux d'exécution et des frais généraux de mémoire assez considérables. Rien de tout cela ne se produit avec la TSA.
Pour autant que je sache, la TSA est disponible uniquement pour clang , pas gcc . Il doit être entièrement disponible depuis Clang 3.6.
Le tsa.h est distribué sous la licence MIT, qui est compatible avec la licence Clang (LLVM): http://llvm.org/docs/developerpolicy.html#license
La licence est à la fois inclinée à tsa.h et disponible en tant que licence de fichier distincte, directement à partir de https://openseource.org/licenses/mit
Je n'aurais pas plongé dedans sans le projet Perl 5. L'un des modes de construction de Perl 5 est de construire avec le support pour les fils POSIX, et pour vérifier la logique de cela, j'ai découvert que Clang avait TSA. Le Perl 5 Porters (le projet de développement et de maintenance Perl 5) a aidé à tester l'API TSA C, un merci spécial à Craig Berry et Jerry Hedden. Vous trouverez quelque chose comme tsa.h dans le cadre de Perl.h dans le code source Perl 5, gracieuseté de moi-même.
Jarkko Hietaniemi <[email protected]>