TSA является статическим инструментом анализа для Clang.
Добавив аннотации (атрибуты) в исходный код, который использует API потоков POSIX и компилируется с
clang -Wthread-safety
Исходный код анализируется во время компиляции на небезопасные шаблоны блокировки, которые приведут к расходам данных или тупикам, или в обоих.
Официальная документация для TSA
https://clang.llvm.org/docs/threadsafetyanalysis.html
Хотя эта страница говорит только об использовании TSA с C ++, вполне возможно использовать большую часть функциональности с простой C.
Это на самом деле, почему этот репозиторий существует.
tsa.h в свой код, где вы используете Mutexes Posix для координации доступа поток POSIX к данным.tsa_mutex вместо pthread_mutex_t .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 доступен только для clang , а не gcc . Это должно быть полностью доступно с тех пор, как Clang 3.6.
tsa.h распределен по лицензии MIT, которая совместима с лицензией Clang (LLVM): http://llvm.org/docs/developerpolicy.html#license
Лицензия подстроена как tsa.h , так и доступна в виде отдельной лицензии на файл непосредственно с https://opensource.org/license/mit
Я бы не погрузился в это без проекта Perl 5. Одним из режимов сборки Perl 5 является сборка при поддержке потоков Posix, и для проверки здравомыслия я обнаружил, что у Clang был TSA. Perl 5 Porters (проект по разработке и обслуживанию Perl 5) помог в тестировании TSA C API, особое благодаря Крейгу Берри и Джерри Хеддену. Вы найдете что -то очень похожее на tsa.h как часть Perl.H в исходном кодексе Perl 5, любезно предоставленного себе.
Jarkko Hietaniemi <[email protected]>