정적 코드 분석은 실행 전에 코드의 잠재적 문제를 미리 찾는 과정이다. 테스트나 런타임에서만 오류를 찾으려 하면, 이미 뒤늦은 경우가 많다. C++ 같은 언어는 메모리 관련 이슈나 잘못된 인덱스 접근이 발생하기 쉬워서, 정적 분석의 가치가 특히 크다.
왜 정적 분석이 필요한가
- 코드가 문법적으로는 맞더라도, 사용하지 않는 변수나 잘못된 배열 접근 같은 문제를 미리 발견할 수 있다.
- 사람이 직접 모든 경고를 잡는 것은 어렵기 때문에, 도구를 활용하는 것이 효율적이다.
- 중요한 원칙은 “경고를 그냥 넘기지 말고, 가능하면 에러로 취급하는 것”이다.
컴파일러 경고 옵션으로 시작하기
가장 쉽게 시작하는 방법은 컴파일러 경고 옵션을 켜는 것이다.
g++ main.cc -Wall -Wextra -Werror이렇게 하면 경고를 발견하자마자 컴파일이 중단되기 때문에, 문제를 바로 수정하게 된다. 예를 들어 -Wall, -Wextra, -Werror는 각각 다음 의미를 가진다.
-Wall: 일반적인 경고를 활성화한다.-Wextra: 추가적인 경고를 더 켠다.-Werror: 경고를 에러로 바꿔 컴파일을 실패시킨다.
CMake에서도 다음처럼 적용할 수 있다.
add_compile_options(
-Werror -Wall -Wextra -Wpedantic -Wconversion -Wsign-conversion -Wshadow
-Wundef -Wunreachable-code -Wstrict-aliasing -Wnull-dereference
-Wdouble-promotion -Wformat=2 -Wcast-qual -Wcast-align
)clang-tidy
clang-tidy는 LLVM 계열의 정적 분석 도구로, 코드 스타일과 안전성 문제를 자동으로 찾고 수정해준다. 특히 다음과 같은 작업을 도와준다.
static함수로 바꾸는 등 코드 구조 개선- 불필요한 캐스팅 제거
const추가,[[nodiscard]]적용,auto와 range-based for loop 사용 권장 등
CLion이나 CMake와 함께 쓰면 편리하다. CMake에서는 CMAKE_CXX_CLANG_TIDY를 사용해 설정할 수 있고, CLion은 IDE 내에서 직접 지원하는 경우가 많다.
cppcheck
cppcheck는 C/C++ 정적 분석 도구로, 코드 패턴과 잠재적 문제를 찾아준다. CLI로도 사용하기 좋고, 예시 명령은 다음과 같다.
cppcheck src --enable=all --std=c++20 --language=c++ --suppress=missingIncludeSystem대표적으로 --enable, --std, --language, --suppress 같은 옵션을 조합해 분석 범위와 예외를 지정할 수 있다. 코드 리뷰나 pre-commit hook에 붙여서 매번 자동 검사하도록 구성하는 것도 좋은 방법이다.
정적 분석을 팀 문화로 만들기
정적 분석은 도구만으로 끝나는 게 아니라, 개발 프로세스에 녹여야 한다. 구글의 사례처럼 다음 세 가지가 중요하다.
- 거짓 양성(false positive)을 줄여서 개발자가 신뢰할 수 있게 만든다.
- 코드 리뷰나 커밋 단계에 자동으로 포함시킨다.
- 팀원이 자신이 가진 지식과 규칙을 분석 도구에 반영할 수 있게 한다.
즉, 정적 분석은 “한 번 설정해 놓고 끝내는 작업”이 아니라, 코드 품질을 꾸준히 관리하는 문화다.
정리
C++에서는 컴파일러 경고 옵션, clang-tidy, cppcheck를 조합해서 쓰는 방식이 실용적이다. 특히 -Wall -Wextra -Werror 같은 기본 설정부터 시작해보고, 팀의 규칙에 맞춰 clang-tidy와 cppcheck를 점차 강화해 가면 좋다. 정적 분석은 버그를 미리 막는 가장 비용 효율적인 방법 중 하나다.