'Clang'에 해당되는 글 1건

  1. 2009/06/19 Clang으로 코드 오류 찾기 (1)

Clang으로 코드 오류 찾기

개발 & SDK 2009/06/19 19:09

CLang 정적 분석기

CLang 정적 분석기는 Objective-C와 C언어로 작성된 코드를 분석해서 오류를 발견해 주는 툴이다. 디버깅이나 인스투루먼츠는 실행중인 프로그램을 분석하는 동적인 작업인 반면, CLang은 정적으로 소스 코드 자체를 분석해서 오류를 검사한다. 검사할 수 있는 오류는 메모리의 누수, dealloc누락, 널(Null)값 참조 등이 있다. 직접 사용해 보자.(CLang은 또다른 프로젝트 LLVM 컴파일러를 위한 프론트엔트 프로젝트이다. LLVM은 GCC를 기반으로 컴파일 성능을 최적화하는 기술을 적용한 프로젝트이다. CLang 프로젝트의 일부로 CLang 정적 분석기 프로젝트가 포함된다. )

*프로젝트 설정하기

CLang분석기를 이용하기 위해서 Xcode상에서 설정할 사항이 하나 있다.

Base SDK 설정

위 그림과 같이 프로젝트 속성에서 Base SDK를 iPhone Simulator로 설정해야 한다. iPhone Device의 경우는 코드 서명 문제로 오류가 발생하기 때문이다. 우리는 정적으로 코드만 분석하면 되기 때문에 시뮬레이터를 선택해 주자.

* 설치하기

CLang 정적 분석기는 다음 사이트에서 무료로 다운로드 받을 수 있다. 오픈소스 프로젝트 이기 때문에 소스코드도 받을 수 있다. 아래 링크에서는 친절하게 맥OS를 위해서 바이너리 형태로 파일을 제공해 주기 때문에, 바로 쓸 수 있다.

http://clang-analyzer.llvm.org/installation.html

다운로드 받은 파일의 압축을 풀면 checker-0.211 과 같이 check-버젼에 해당하는 디렉터리가 생긴다. 이 디렉터리를 원하는 위치에 위치시키자. 그리고 경로에 그 위치를 추가한다. 터미널을 실행 시키고, 다음과 같이 PATH에 경로를 추가하자.

$ export PATH=$PATH:/디렉터리 위치/checker-0.211

* 분석 진행

이제 Xcode 프로젝트가 있는 디렉터리로 이동하자. 그리고 다음 명령을 실행시키자.

$ xcodebuild clean -configuration Debug
$ scan-build -k -V xcodebuild -configuration Debug -sdk iphonesimulator3.0

첫 번째 명령은 프로젝트의 빌드파일을 모두 정리하는 명령이다. 두번째가 실제로 CLang분석기를 실행시키는 명령이다. 명령을 내리면 CLang분석기는 디버그 타깃을 시뮬레이터SDK로 빌드하고, 그 결과를 보여줄 것이다. 문제가 발견되면 그림30과 같이 웹페이지를 실행시켜 준다. (만약 프로젝트의 빌드가 실패하면 분석결과 오류를 발견했더라도 실행이 멈추게 되어있다. 성공적으로 빌드되었는지 확인하기 바란다.) 만약 성공적으로 빌드하고 오류가 전혀 발견되지 않았다면 웹페이지는 따로 보여주지 않는다.

CLang 분석기로 애플리케이션을 하나 분석해 보자. 아래 그림이 그 결과다.

<그림> 발견한 오류를 웹 페이지로 보여준다.

다행이 오류가 하나 만 발견되었다. Leak of returne object 오류인데, 객체를 해제하지 않았다는 오류이다. 한 가지 주의할 점은 CLang 분석기가 오류로 판단했다고 해서 반드시 오류는 아니라는 것이다. 어디까지나 그 것이 오류인지를 판단하는 것은 개발자의 몫이다. 진짜 오류인지 한번 들어가 보자. 왼쪽 화면의 View Report 를 클릭하자. 그러면 문제가 되는 소스코드를 보여주고, 친절하게 설명까지 보여준다.

31행에서 NSURL 객체를 생성하고 34행에서 잘 사용했다. 그런데 해제하지 않았다. 실수다. 고치도록 하자.

25: - (void)viewDidLoad {
26: [super viewDidLoad];
27:
28: id sndPath = [[NSBundle mainBundle] pathForResource:@"dog"
29: ofType:@"aiff" inDirectory:@"/"];
30: // URL 타입 생성
31: CFURLRef baseURL = (CFURLRef)[[NSURL alloc]
32: initFileURLWithPath:sndPath];
33: // SoundID 생성
34: AudioServicesCreateSystemSoundID(baseURL,&m_sndID);
35: CFRelease(baseURL);
36: }

어떤가? 상당이 좋은 툴이다. 자신이 개발하고 있는 프로젝트도 당장 CLang분석기로 분석 해보자. 큰 도움이 될 것이다.

Creative Commons License
Trackback 0 : Comment 1

Trackback Address :: http://maclove.pe.kr/trackback/33 관련글 쓰기

  1. 윤광근 2010/07/20 16:41 Modify/Delete Reply

    예제파일을 열려고하는데요.. 속성창중에 base sdk를 바꿀수잇는 속성이없는거같은데...

    이거어떻게 해야할까요?;;

    xcode 3.2.3 버전이라고 나오네요...

Write a comment