오픈소스 정적 분석 도구 Cppcheck 사용하기 - Static Analysis
프로그램 개발을 하는 조직이 어느 정도 규모가 있고 체계적이어서 QA 조직까지 있으면 나름 프로그램 품질 관리의 수준을 높일 수 있는 기반은 갖추어진 것이라 할 수 있다. 물론 QA 조직에서 공격적이면서도 꼼꼼한 다양한 테스트 케이스 작성과 테스트 자동화를 운용하고 있을 때 이런 이야기도 가능할 것이다. 그렇다면, 이런 조직도 없고, 풍성한 테스트 케이스에 기반한 자동 테스트 시스템도 없다면 어떻게 프로그램의 품질을 놓일 수 있을까?
유닛 테스트(Unit Test)로 미처 개발자가 감안하지 못한 오류를 검출하거나 잘못된 프로그램 수정으로 인한 오류를 예방할 수도 있고 테스트 커버리지(Coverage)를 극대화한 테스트 자동화 시스템 구축도 검토해 볼만하고, 성능 프로파일링(Performance Profiling)을 통해서 수행 또는 호출 빈도가 높은 구간에 대한 집중적인 코드 개선을 해볼 수도 있지만 이번에 하려는 작업은 정적 분석(Static Analysis)이다.
정적 분석은 말 그대로 프로그램을 수행하지 않은 상태에서 소스 코드를 분석하여 메모리 유출(Leaks) 가능성이 있는 곳, 널 포인터 이슈가 있는 곳, 배열 첨자의 범위를 넘어서는 곳 등, 다양한 위험 요소들을 찾아서 코드를 수정하도록 하는 것이다. 이 작업은 온전히 분석 도구에 의존한 작업일 수밖에 없고 여러 가지 상용 도구가 있지만 리눅스 시스템에서 간편하게 수행할 수 있고 C/C++에 특화되어 있으며 오픈 소스 프로젝트인 Cppcheck(https://cppcheck.sourceforge.io/)를 사용하기로 했다.
정적 분석 도구중에는 코딩 표준에 따라 코딩이 이루어졌는지도 검사하는 도구도 있는데, 정적 분석 도구를 통한 검사 과정을 프로그램 빌드에 포함시켜서 이슈가 있는 경우 다음 단계로 진행하지 못하게 하는 조직도 있다. 이런 과정을 통해서 코딩 스타일의 표준화를 유지하고 프로그램의 기본 품질을 확보하고자 하는 것이다.
리눅스에서 작업 한다면 설치는 아주 간단하다. 대부분의 리눅스 배포판에 Cppcheck가 포함되어 있기 때문이다. 우분투와 같은 데비안 계열이라면 위의 그림과 같이 "sudo apt-get install cppcheck" 명령으로 간단하게 설치할 수 있다. 사용법을 담은 매뉴얼은 https://cppcheck.sourceforge.io/manual.html에서 볼 수 있다.
가장 쉬운 사용법은 "cppcheck 폴더 이름"을 입력하는 것으로 위의 그림처럼 폴더 내의 코드들을 찾아서 분석을 시작한다. 결과는 화면으로 나오므로 저장하거나 나름의 방법을 사용하는 것이 좋다.
분석을 반복적으로 수행하는 경우 이전에 분석한 이후로 변경이 없었던 코드는 굳이 다시 분석할 필요가 없을 것이다. 이런 정보를 관리하는 폴더를 하나 생성해서 "cppcheck --cppcheck-build-dir=작업디렉토리 ..." 처럼 옵션을 추가해 주면 분석 작업을 보다 빠르게 수행할 수 있다.