TSA ist ein statisches Analysetool für Clang.
Durch Hinzufügen von Anmerkungen (Attributen) zu dem Quellcode, der die POSIX -Threads -API verwendet, und mit dem Kompilieren mit
clang -Wthread-safety
Der Quellcode wird in Kompilierungszeit für unsichere Verriegelungsmuster analysiert, die zu Datenrennen oder Deadlocks oder beides führen würden.
Die offizielle Dokumentation für TSA ist
https://clang.llvm.org/docs/threadsafetyanalysis.html
Während diese Seite nur über die Verwendung von TSA mit C ++ spricht, ist es durchaus möglich, den größten Teil der Funktionalität mit Plain C zu verwenden.
Das ist in der Tat, warum dieses Repository existiert.
tsa.h in Ihren Code ein, in dem Sie Possixe -Mutexes verwenden, um den Zugriff von POSIX -Threads auf Daten zu koordinieren.tsa_mutex anstelle von pthread_mutex_t .clang -Wthread-safety .Sie können beispielhafte Verwendung und die durch Ausgabe verursachten Fehler sehen
make
Jedes der Beispielprogramme demonstriert einen bestimmten Fehlertyp.
Zum Beispiel:
tsa_mutex mut;
int g TSA_GUARDED_BY(&mut);
int main {
g = 1; // This would be bad.
}
Um zu sehen, wie die Probleme behoben werden können, haben Sie Probleme
make pass
und studieren Sie die Beispielprogramme.
Der erste Zweig des #ifndef TSA_PASS zeigt den falschen Weg (was möglicherweise nichts tun kann), während der zweite Zweig, der #else , den richtigen Weg zeigt.
TSA ist nicht dasselbe wie Thread -Desinfektionsmittel oder TSAN .
Die TSA ist vollständig kompiliert, während der Thread-Desinfektionsmittel der Compiler-Ausgabe instrumentiert wird, damit die Laufzeit während der Ausführung Datenrennen erkennen kann. Die hinzugefügte Instrumentierung fügt einen gewissen Ausführungsaufwand und ein erheblicher Speicheraufwand hinzu. Nichts davon passiert mit TSA.
Soweit ich weiß, ist TSA nur für clang und nicht für gcc erhältlich. Es sollte seit Clang 3.6 vollständig verfügbar sein.
Die tsa.h wird unter der MIT -Lizenz verteilt, die mit der Lizenz (LLVM) kompatibel ist: http://llvm.org/docs/developerpolicy.html#license
Die Lizenz ist sowohl in tsa.h als auch als separate Dateilizenz direkt von https://opensource.org/licenses/Mit erhältlich
Ohne das Perl 5 -Projekt hätte ich mich nicht eingehalten. Einer der Build -Modi von Perl 5 besteht darin, mit Unterstützung von POSIX -Threads zu bauen und die Logik davon zu überprüfen, dass Clang TSA hatte. Die Perl 5 -Träger (das Perl 5 -Entwicklungs- und Wartungsprojekt) halfen beim Testen der TSA C -API, besonderer Dank an Craig Berry und Jerry Hedden. Sie werden tsa.h als Teil von Perl.h im Perl 5 -Quellcode, mit freundlicher Genehmigung von mir selbst, sehr ähnlich finden.
Jarkko Hietaniemi <[email protected]>