TSA는 Clang의 정적 분석 도구입니다.
POSIX 스레드 API를 사용하는 소스 코드에 주석 (속성)을 추가하고
clang -Wthread-safety
소스 코드는 데이터 레이스 또는 교착 상태 또는 둘 다로 이어지는 안전하지 않은 잠금 패턴에 대해 컴파일 타임으로 분석됩니다.
TSA의 공식 문서는입니다
https://clang.llvm.org/docs/threadsafetyanalysis.html
이 페이지는 C ++와 함께 TSA를 사용하는 것에 대해서만 이야기하지만 Plain C와 함께 대부분의 기능을 사용할 수 있습니다.
그것이 실제로이 저장소가 존재하는 이유입니다.
tsa.h 포함시킵니다.pthread_mutex_t 대신 tsa_mutex 사용하십시오.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는 gcc 아닌 clang 에서만 사용할 수 있습니다. Clang 3.6 이후로 완전히 사용할 수 있어야합니다.
tsa.h Clang (LLVM) 라이센스와 호환되는 MIT 라이센스에 따라 배포됩니다.
라이센스는 tsa.h 에 상환되며 https://opensource.org/licenses/mit에서 직접 별도의 파일 라이센스로 제공됩니다.
Perl 5 프로젝트 없이는 이것에 대해 탐구하지 않았을 것입니다. Perl 5의 빌드 모드 중 하나는 Posix 스레드를 지원하고 구축하는 것입니다. Perl 5 Porters (Perl 5 개발 및 유지 보수 프로젝트)는 Craig Berry와 Jerry Hedden 덕분에 TSA C API를 테스트하는 데 도움이되었습니다. 당신은 perl 5 소스 코드에서 나 자신이 제공하는 perl.h의 일부로 tsa.h 매우 유사한 것을 찾을 수 있습니다.
Jarkko Hietaniemi <[email protected]>