다양한 종류의 정의되지 않은 동작 (특히 경쟁 조건)이 존재하지 않는다는 것을 절대 확신 할 수있는 방법이 없습니다.
그러나 그러한 상황을 잘 보여주는 여러 가지 도구가 있습니다. 수정 사항이 유효하다는 것을 증명할 수는 없지만 현재 이러한 도구에 문제가 있음을 증명할 수 있습니다.
이 목적을위한 몇 가지 흥미로운 도구 :
Valgrind는 메모리 검사기입니다. 메모리 누수, 초기화되지 않은 메모리 읽기, 매달려있는 포인터 사용 및 범위를 벗어난 액세스를 찾습니다.
Helgrind는 스레드 안전 검사기입니다. 경쟁 조건을 찾습니다.
둘 다 동적 계측에 의해 작동합니다. 즉, 프로그램을있는 그대로 가져와 가상화 된 환경에서 실행합니다. 이렇게하면 방해가되지 않지만 느려집니다.
UBSan은 정의되지 않은 동작 검사기입니다. 정수 오버플로, 범위를 벗어난 시프트 및 유사한 것들과 같은 다양한 C 및 C ++ 정의되지 않은 동작을 찾습니다.
MSan은 메모리 검사기입니다. Valgrind와 비슷한 목표를 가지고 있습니다.
TSan은 스레드 안전 검사기입니다. Helgrind와 비슷한 목표를 가지고 있습니다.
이 세 가지는 Clang 컴파일러에 내장되어 있으며 컴파일시 코드를 생성합니다. 즉, 빌드 프로세스에 통합해야하며 (특히 Clang으로 컴파일해야 함) 초기에 * grind보다 설정하기가 훨씬 어렵지만 반면에 런타임 오버 헤드는 훨씬 낮습니다.
내가 나열한 모든 도구는 Linux에서 작동하고 일부는 MacOS에서 작동합니다. 아직 Windows에서 안정적으로 작동하지 않는다고 생각합니다.