2009년 5월 7일 목요일

C/C++ 정적 코드 분석기 cppcheck

http://cppcheck.wiki.sourceforge.net/

http://rein.upnl.org/wordpress/archives/1573
에서 존재를 알게됨.

위키피디아에서 몇가지 읽어둘만한 페이지들

lint(splint) 는 세팅이 귀찮고(include 지정등) C 만 지원하고 너무 쪼잔한 놈이라 쓰기가 좀 그런데 cppcheck 는 사용도 쉽고 현재 내 코드(valgrind 기반으로 품질유지되는 코드들)을 체크해보니 에러 안뜨는걸 봐서 너무 쪼잔한것까지 잡아주지는 않는것 같다.(정확히는 못잡아준다는 거겠지. 이거 돌려서 패스했다고 에러없다고 보장되는건 아니고 그냥 실수로 남긴 뻔한 버그를 잘하면 찾아주는 툴.. 정도로 인식하자.)

결론적으로 별 스트레스 없이 바로 적용가능한 수준의 툴이라고 생각되네.
그래서 cmake 에 바로 적용을 해봤다.
# cppcheck 가 있을 경우,
# 소스트리루트 아래에 있는 .c/.cpp/.cc 파일들을 찾아서
# cppcheck -a 실행
# 단 에러외엔 관심없으니 표준출력은 /dev/null 쪽으로.
find_program(cppcheck NAMES cppcheck)
if(cppcheck)
add_custom_target(cppcheck ALL find ${CMAKE_SOURCE_DIR} -name "*.c" -o -name "*.cpp" -o -name "*.cc" | xargs cppcheck -a > /dev/null)
endif(cppcheck)

TODO
1. 소스찾는것을 find 로 찾고있는데 이건 좀 그렇지?
2. 소스찾을때 마지막 make 이후 변경된 놈만 찾아서 cppcheck 해야겠지?
3. 그게 안되면 ALL 을 빼서 필요할때만 명시적으로 돌려보도록 하자?
4. 정 맘에 안들면 test 쪽에 의존성을 걸어서 test 실행될때만 cppcheck 를 하도록?

추가. man 을 먼저 좀 볼걸.
  • -q 옵션을 주면 에러만 뱉도록 할수있다. 표준출력 무시해줄 필요 없었네.
  • -I 옵션으로 인클루드 패스지정이 가능한데 필요없다고 되어있는데 흠. 주면 더 잘잡아주나?
  • -s 옵션은.. 흠.. 한번쯤 참고할만한 정보를 주긴 하지만 내게는 별 가치없는 정보들이군. 혹시모르니 이놈 잊지말자. 가능하면 빡시게 잡아주는게 좋긴 하지.
추가.


추가 2010-04-09
  • 오랜만에 보니 꽤나 좋아졌네 gui 도 주고.
  • 전에는 find 돌렸었는데 이제보니 그냥 디렉토리를 인자로 두면 되더라. 전에도 그랬었는데 내가 못본건가? 어쨌건 이제 cppcheck 관련 cmake 스크립트를 이렇게 쓰고있다
    [code]
    find_program(cppcheck NAMES cppcheck)

    if(cppcheck)
      add_custom_target(cppcheck
        ${cppcheck} --enable=style --template gcc ${CMAKE_SOURCE_DIR}
      )
      add_custom_target(cppcheck_all
        ${cppcheck} --enable=all --template gcc ${CMAKE_SOURCE_DIR}
      )
    endif(cppcheck)
    [/code]

댓글 3개:

자나가는이 :

좋은 정보 잘 보았습니다.

cppcheck를 실행하고 난후의 결과물을 어떻게 보죠

2_0_0_2.default.ccfxprep 이런 확장자가 붙는데...

yoonkn :

@자나가는이 - 2009/05/14 19:44
흠. 그냥 cppcheck 돌리면 표준에러로 에러를 보여줍니다. 예를들어 new 만하고 delete 를 빼먹은 아래 코드를 작성하고



int main()

{

int* foo = new int;

}



콘솔등에서 cppcheck 를 돌리면 이런 결과가 나옵니다.



yoonkn@dogshit:/tmp/cpp$ cppcheck a.cpp

Checking a.cpp...

[a.cpp:4]: (error) Memory leak: foo

yoonkn@dogshit:/tmp/cpp$



cppcheck 가 따로 어떤 파일을 생성하지는 않던데 ccfxprep 는 어떤 파일인지 모르겠네요. 대강 검색해보면 http://www.ccfinder.net/ 가 걸리던데 혹시 저 툴을 쓰시는게 아니신지..

김재호의 디지털보단 아날로그 :

trackback from: 오픈소스 C++ 코드 정적 분석툴 cppcheck
나는 디바이스 드라이버를 개발할 때, 마이크로소프트의 Prefast for drivers 를 몹시 애용한다. 내가 미처 생각하지 못했던 실수들을 잘 발견해서 가르쳐주기 때문에, 나는 코딩할 때는 항상 경고레벨을 최고로 둠과 동시에 빌드시마다 Prefast 를 자동으로 실행시켜서 경고가 발생했는지 확인하고는 한다. 이렇게 함으로써 버그를 잡을 수 있을 뿐아니라 코드를 조금 더 정교하고 튼튼하게 만들고, 여러 좋은 습관들까지 몸에 베도록 할 수있다. 이..