O TSA é uma ferramenta de análise estática para Clang.
Adicionando anotações (atributos) ao código -fonte que está usando a API POSIX Threads e compilando com
clang -Wthread-safety
O código-fonte é analisado em tempo de compilação para padrões de bloqueio inseguros que levariam a corridas de dados ou impasse, ou ambos.
A documentação oficial para TSA é
https://clang.llvm.org/docs/threadsafetyAnalysis.html
Enquanto essa página fala apenas sobre o uso do TSA com C ++, é bem possível usar a maior parte da funcionalidade com o PLARO C.
Ou seja, por isso existe esse repositório.
tsa.h no seu código, onde você usa o Posix Mutexes para coordenar o acesso dos threads do POSIX aos dados.tsa_mutex em vez de pthread_mutex_t .clang -Wthread-safety .Você pode ver o uso de exemplo e os erros causados pela emissão
make
Cada um dos programas de exemplo demonstra um tipo específico de erro.
Por exemplo:
tsa_mutex mut;
int g TSA_GUARDED_BY(&mut);
int main {
g = 1; // This would be bad.
}
Para ver como corrigir os problemas, emitir
make pass
e estudar os programas de exemplo.
A primeira filial do #ifndef TSA_PASS mostra a maneira errada (que pode ser: "não fazendo nada"), enquanto o segundo ramo, o #else , mostra o caminho certo.
O TSA não é a mesma coisa que o desinfetante de threads ou Tsan .
O TSA é completamente com tempo de compilação, enquanto o desinfetante do encadeamento adiciona instrumentação à saída do compilador para que o tempo de execução possa detectar corridas de dados durante a execução. A instrumentação adicionada adiciona uma sobrecarga de execução e uma sobrecarga de memória bastante considerável. Nada disso acontece com o TSA.
Até onde eu sei, o TSA está disponível apenas para clang , não gcc . Deve estar totalmente disponível desde o Clang 3.6.
O tsa.h é distribuído sob a licença do MIT, que é compatível com a licença Clang (LLVM): http://llvm.org/docs/developerpolicy.html#license
A licença está inlinada ao tsa.h e disponível como uma licença de arquivo separada, diretamente em https://opensource.org/license/MIT
Eu não teria mergulhado nisso sem o projeto Perl 5. Um dos modos de construção do Perl 5 é construir com suporte para threads POSIX e, para a sanidade, verifique a lógica disso, descobri que Clang tinha TSA. O Perl 5 Porters (o Projeto de Desenvolvimento e Manutenção do Perl 5) ajudou a testar a API da TSA C, agradecimentos especiais a Craig Berry e Jerry Hedden. Você encontrará algo muito parecido com tsa.h como parte do Perl.H no Código Fonte Perl 5, cortesia de mim mesmo.
Jarkko Hietaniemi <[email protected]>