Post thumbnail

Cppcheck를 이용한 C++ 프로젝트 정적 분석

· by 박승재

정적 분석이란 프로그램을 직접 실행하지 않고, 프로그램 코드만을 참고해 프로그램의 동작을 분석하는 것을 말합니다.

C++의 대표적인 정적 분석 도구로는 Cppcheck가 있습니다.

Cppcheck는 정적 분석을 통해 프로그램에서 발생가능한 버그 찾아내 프로그래머에게 경고하는 용도로 사용되는 도구입니다.


Cppcheck 홈페이지의 파일을 다운받아 설치합니다.

Windows 사용자라면 Scoop을 이용해 설치할 수도 있습니다.

참고: Scoop: 빨리 세팅해주세요 현기증 난단 말이에요

$ scoop search cppcheck
Results from local buckets...

Name     Version Source Binaries
----     ------- ------ --------
cppcheck 2.9     main

$ scoop install cppcheck
Updating Scoop...
Updating 'main' bucket...
Scoop was updated successfully!
Installing 'cppcheck' (2.9) [64bit] from main bucket
cppcheck-2.9-x64-Setup.msi (16.8 MB) [========================================================================] 100%
Checking hash of cppcheck-2.9-x64-Setup.msi ... ok.
Extracting cppcheck-2.9-x64-Setup.msi ... done.
Linking ~\scoop\apps\cppcheck\current => ~\scoop\apps\cppcheck\2.9
Creating shim for 'cppcheck'.
'cppcheck' (2.9) was installed successfully!


$ cppcheck
Cppcheck - A tool for static C/C++ code analysis

    cppcheck [OPTIONS] [files or paths]

If a directory is given instead of a filename, *.cpp, *.cxx, *.cc, *.c++, *.c, *.ipp,
*.ixx, *.tpp, and *.txx files are checked recursively from the given directory.


cppcheck을 입력하면 도움말이 나옵니다.

  • --enable: 검사를 활성화할 옵션을 지정합니다. 일반적으로 --enable=warning을 사용합니다. 여러 개의 옵션은 ,로 구분합니다.

      Enable additional checks. The available ids are:
      * all
              Enable all checks. It is recommended to only
              use --enable=all when the whole program is
              scanned, because this enables unusedFunction.
      * warning
              Enable warning messages
      * style
              Enable all coding style checks. All messages
              with the severities 'style', 'warning',
              'performance' and 'portability' are enabled.
      * performance
              Enable performance messages
      * portability
              Enable portability messages
      * information
              Enable information messages
      * unusedFunction
              Check for unused functions. It is recommended
              to only enable this when the whole program is
      * missingInclude
              Warn if there are missing includes. For
              detailed information, use '--check-config'.
      Several ids can be given if you separate them with
      commas. See also --std
  • --project: .sln, .vcxproj, compile_commands.json 등의 프로젝트 소스코드 위치가 정의된 설정 파일을 참고합니다.

    Visual Studio 프로젝트의 경우, --project=myproject.sln 옵션을 주면 됩니다.

      Run Cppcheck on project. The <file> can be a Visual
      Studio Solution (*.sln), Visual Studio Project
      (*.vcxproj), compile database (compile_commands.json),
      or Borland C++ Builder 6 (*.bpr). The files to analyse,
      include paths, defines, platform and undefines in
      the specified file will be used.
  • --std: C++ 버전을 지정합니다.

      Set standard.
      The available options are:
      * c89
              C code is C89 compatible
      * c99
              C code is C99 compatible
      * c11
              C code is C11 compatible (default)
      * c++03
              C++ code is C++03 compatible
      * c++11
              C++ code is C++11 compatible
      * c++14
              C++ code is C++14 compatible
      * c++17
              C++ code is C++17 compatible
      * c++20
              C++ code is C++20 compatible (default)
  • --template: 출력 포맷을 지정합니다.

    Visual Studio 출력 형식을 이용하려면 --template=vs 옵션을 주면 됩니다.

      Format the error messages. Available fields:
      {file}              file name
      {line}              line number
      {column}            column number
      {callstack}         show a callstack. Example:
                              [file.c:1] -> [file.c:100]
      {inconclusive:text} if warning is inconclusive, text
                          is written
      {severity}          severity
      {message}           warning message
      {id}                warning id
      {cwe}               CWE id (Common Weakness Enumeration)
      {code}              show the real code
      \t                 insert tab
      \n                 insert newline
      \r                 insert carriage return
      Example formats:
      '{file}:{line},{severity},{id},{message}' or
      '{file}({line}):({severity}) {message}' or
      '{callstack} {message}'
      Pre-defined templates: gcc (default), cppcheck1 (old default), vs, edit.


Visual Studio로 작성한 myproject모든 오류 및 발생가능한 버그를 검사합니다:

$ cppcheck --enable=all --project=myproject.sln --template=vs
Checking src\bitmap.cpp Debug|Win32...
Checking src\bitmap.cpp: _WIN32=1;WIN32=1;_DEBUG=1;_CONSOLE=1;__SSE2__=1;_MSC_VER=1900...
src\bitmap.cpp(39): warning: Class 'Bitmap' does not have a operator= which is recommended since it has dynamic memory/resource allocation(s).
1/24 files checked 4% done