보였다..! 빈틈의 실! 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
Syntax:
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.
Options:
--addon=<addon>
...
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 scanned. * 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
...
← 다음 글
GitHub 저장소의 Languages가 잘못 표기되었을 때
이전 글 →
Visual Studio에서 외부 라이브러리를 불러오는 방법