TSA es una herramienta de análisis estático para Clang.
Agregando anotaciones (atributos) al código fuente que está utilizando la API POSIX HIREDS y compilando con
clang -Wthread-safety
El código fuente se analiza en el tiempo de compilación para patrones de bloqueo inseguros que conducirían a carreras de datos o bloqueos muertos, o ambos.
La documentación oficial de TSA es
https://clang.llvm.org/docs/threadsafetyanalysis.html
Si bien esa página solo habla sobre el uso de TSA con C ++, es muy posible usar la mayor parte de la funcionalidad con C.
De hecho, eso es por qué existe este repositorio.
tsa.h en su código donde use Posix Mutexes para coordinar el acceso a los datos de Posix Hreads.tsa_mutex en lugar de pthread_mutex_t .clang -Wthread-safety .Puede ver el uso de ejemplo y los errores causados por la emisión
make
Cada uno de los programas de ejemplo demuestra un tipo particular de error.
Por ejemplo:
tsa_mutex mut;
int g TSA_GUARDED_BY(&mut);
int main {
g = 1; // This would be bad.
}
Para ver cómo solucionar los problemas, problema
make pass
y estudiar los programas de ejemplo.
La primera rama del #ifndef TSA_PASS muestra la forma incorrecta (que puede ser: "No hacer nada"), mientras que la segunda rama, la #else , muestra la forma correcta.
La TSA no es lo mismo que el desinfectante de hilos o el tsan .
El TSA es completamente en tiempo de compilación, mientras que el desinfectante de subprocesos agrega instrumentación a la salida del compilador para que el tiempo de ejecución pueda detectar las carreras de datos durante la ejecución. La instrumentación agregada agrega algunas sobrecargas de ejecución y una sobrecarga de memoria bastante considerable. Nada de esto sucede con TSA.
Hasta donde yo sé, TSA está disponible solo para clang , no gcc . Debe estar completamente disponible desde Clang 3.6.
El tsa.h se distribuye bajo la licencia MIT, que es compatible con la licencia Clang (LLVM): http://llvm.org/docs/developerpolicy.html#license
La licencia se ingresa a tsa.h , y está disponible como una licencia de archivo separada, directamente desde https://opensource.org/licenses/MIT
No habría profundizado en esto sin el proyecto Perl 5. Uno de los modos de construcción de Perl 5 es construir con soporte para los hilos Posix, y para verificar la cordura, verificar la lógica de eso, descubrí que Clang tenía TSA. Los Porters de Perl 5 (el Proyecto de Desarrollo y Mantenimiento de Perl 5) ayudaron a probar la API de TSA C, agradecimiento especial a Craig Berry y Jerry Hedden. Encontrará algo muy parecido a tsa.h como parte de Perl.h en el código fuente de Perl 5, cortesía de mí mismo.
Jarkko Hietaniemi <[email protected]>