정적 분석
정적 분석(Static Program Analysis)은 프로그램의 실제 실행을 수행하지 않고 소스·중간 표현 또는 바이너리를 분석해 코드의 성질과 오류 가능성을 추론하는 기술이다. 컴파일러의 이름 해석·타입 검사부터 제어·데이터 흐름과 별칭·포인터 분석, 취약점 탐지·규칙 검사까지 범...
| 영어 명칭 | Static Program Analysis |
|---|---|
| 분류 | 프로그램 실행 없이 코드 성질을 분석하는 기술 |
| 입력 | 소스 코드·AST·IR·바이트코드 |
| 주요 기술 | 데이터 흐름·제어 흐름·포인터·타입 분석 |
| 도구 | Clang Static Analyzer, Coverity, CodeQL 등 |
| 목적 | 오류·취약점·스타일·정확성 검사 |
| 검증 | 형식 검증과 연계 가능 |
| 오류 | 거짓 양성·거짓 음성 가능 |
| 공식 자료 | Clang Static Analyzer |
| CodeQL | CodeQL Documentation |
정적 분석(Static Program Analysis)은 프로그램의 실제 실행을 수행하지 않고 소스·중간 표현 또는 바이너리를 분석해 코드의 성질과 오류 가능성을 추론하는 기술이다. 컴파일러의 이름 해석·타입 검사부터 제어·데이터 흐름과 별칭·포인터 분석, 취약점 탐지·규칙 검사까지 범위가 넓다. 컴파일러와 IDE·CI 도구에서 사용하지만 프로그램 전체가 오류 없음을 무조건 보증하는 기술은 아니다.[1]
분석기는 제어 흐름 그래프(CFG)에서 가능한 경로를 탐색하고 데이터 흐름에 따라 변수·메모리·호출의 상태를 추정한다. 경로 민감·문맥 민감 분석은 정확도를 높일 수 있지만 계산량이 증가한다. 형식 분석과 심벌 실행, 추상 해석·포인터 분석은 문제의 성질과 성능 목표에 맞춰 결합할 수 있다.
정적 분석은 미초기화 변수·null 역참조·자원 누수와 일부 정수 범위 오류, 보안상 위험한 API 이용 등을 검사한다. 하지만 런타임 데이터와 시스템 호출·외부 라이브러리를 완전히 알 수 없는 경우 거짓 양성(false positive)과 거짓 음성(false negative)이 생길 수 있다. 실사용에서는 테스트·퍼징과 코드 리뷰 및 동적 분석을 함께 적용한다.[2]
개발 환경에서는 컴파일러 진단·clang-tidy, 별도 정적 분석기와 IDE의 검사 기능이 상호 보완된다. 규칙을 실행할 때는 프로젝트의 언어 버전·빌드 옵션·종속성·플랫폼을 고려해야 하고, 발견된 경고의 심각도와 재현 가능성을 검토해야 한다.