정적 프로그램 분석은 실행하지 않은 상태의 프로그램 코드를 대상으로, 프로그램의 구조·동작·특성 등을 자동화된 도구나 방법을 이용해 분석하는 기술을 말한다. 일반적으로 소스 코드, 중간 코드(예: 바이트코드), 혹은 컴파일된 바이너리 파일을 입력으로 하며, 실행 시점에 발생할 수 있는 오류나 보안 취약점을 사전에 발견하는 데 활용된다.
주요 목적
- 버그 및 결함 발견 – 널리 알려진 오류 패턴(예: null 포인터 역참조, 배열 인덱스 초과)을 자동으로 탐지한다.
- 보안 취약점 식별 – SQL 인젝션, 크로스사이트 스크립팅(XSS) 등과 같은 보안 위협을 코드 수준에서 검출한다.
- 코드 품질 및 일관성 검사 – 코딩 표준·스타일 가이드 위반, 복잡도 초과 등을 평가한다.
- 형식 검증 – 형식적 방법(formal methods)을 적용해 프로그램이 사양(specification)을 만족하는지 확인한다.
분석 기법
- 문법 기반 검사(Syntax checking) : 파싱 과정을 통해 문법 오류를 식별한다.
- 데이터 흐름 분석(Data‑flow analysis) : 변수·메모리의 정의·사용(def‑use) 관계를 추적한다.
- 제어 흐름 분석(Control‑flow analysis) : 프로그램의 실행 경로를 그래프로 모델링한다.
- 형식적 모델링(Formal modeling) : 추상 해석(Abstract Interpretation)이나 모델 체킹(Model checking) 등을 이용해 프로그램의 동작을 수학적으로 증명한다.
- 패턴 매칭(Pattern matching) : 미리 정의된 오류 패턴과 소스 코드를 비교한다.
대표적인 도구
| 범주 | 도구 예시 | 주요 특징 |
|---|---|---|
| 일반 정적 분석 | SonarQube, PMD, Checkstyle | 다중 언어 지원, 코드 품질 지표 제공 |
| 보안 정적 분석 | Fortify, Checkmarx, FindSecBugs | 취약점 규칙 및 CWE 매핑 |
| 형식적 분석 | CBMC, Frama-C, KLEE | 정량적 증명·경로 탐색 기능 |
| 바이너리 정적 분석 | Ghidra, IDA Pro, angr | 기계어 수준에서 제어·데이터 흐름 파악 |
장점 및 한계
- 장점
- 실행 없이 사전 검증이 가능하므로 테스트 비용을 절감할 수 있다.
- CI/CD 파이프라인에 자동화하기 용이하며, 코드 변경 시 즉시 피드백을 제공한다.
- 한계
- 실제 실행 시 발생하는 동적 행동(예: 런타임 환경, 입력 데이터)에 대한 검증이 부족할 수 있다.
- 부정확한 경고(오탐)와 누락된 경고(미탐) 문제로 인해 결과 해석에 전문가의 판단이 필요하다.
연구 및 표준화 동향
- ISO/IEC 27034와 같은 보안 표준에서는 정적 분석을 소프트웨어 보안 관리 프로세스의 핵심 단계로 규정한다.
- 최근에는 머신러닝 기반 정적 분석이 연구되고 있어, 기존 규칙 기반 접근법보다 높은 정확도를 목표로 하고 있다.
관련 용어
- 동적 프로그램 분석(Dynamic program analysis) : 실제 실행 중에 수집된 런타임 정보를 기반으로 분석한다.
- 정적 코드 분석(Static code analysis) : 정적 프로그램 분석과 동의어로 쓰이는 경우가 많다.
위 내용은 공개된 학술 자료·전문 서적·오픈소스 도구 문서 등을 종합하여 객관적으로 기술하였다.