
Cake의 정적 분석은 C 코드에 주석으로 계약을 표시하고, 포인터의 널 허용 여부와 메모리 소유권, 초기화 상태가 그 계약에 맞는지 함수별로 검사한다. 검사는 기본적으로 꺼져 있으며 파일 앞부분에 #pragma safety enable을 넣어 켤 수 있다. 예제는 Cake 0.15.28로 검사했다.
_Opt는 널이 될 수 있는 포인터를, _Owner는 가리키는 자원을 책임지는 포인터를 표시한다. _Out은 함수가 전달된 객체를 초기화한다고 선언하고, _Dtor는 객체가 소유한 자원을 해제한다고 표시한다. _Clear는 해제 뒤 객체를 0으로 만들며, _Uninitialized는 초기화되지 않은 결과를, _View는 소유권을 넘기지 않고 참조하는 객체를 나타낸다. 분석기는 이 계약을 호출자와 함수 구현 양쪽에서 각각 확인한다.
분석은 한 번에 한 함수씩 수행하며, 호출된 함수의 내부를 들여다보지 않고 선언에 적힌 계약을 기준으로 판단한다. 따라서 선언에 계약이 빠져 있으면 분석기가 포인터의 관계나 자원 이동을 알아내지 못할 수 있다. 문서는 realloc처럼 성공 여부에 따라 소유권 이전이 달라지는 계약을 표현할 문법이 아직 없고, 깊은 const 검사도 지원하지 않는다고 설명한다. 큰 함수에서는 분석을 중단하고 경고 97을 한 번 낸다. 뒤로 이동하는 goto, 두 포인터의 비교, 크기를 컴파일 시점에 알 수 없는 배열의 범위 검사에도 한계가 있다.
전체 규칙과 예제는 Cake 정적 분석 문서에서 볼 수 있으며, 예제는 온라인 플레이그라운드에서 실행할 수 있다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요