소프트웨어 정적분석으로 코드 실행 전 결함 찾기

소프트웨어 정적분석의 분석 기법과 도구, AST·기호 실행 원리, CI/CD 적용 시 오탐과 미탐을 다루는 방법을 정리한다.

2026-08-14 · 최초 발행 2025-05-23

실행 전에 코드에서 찾아낼 수 있는 문제

소프트웨어 정적분석(Static Analysis)은 프로그램을 실행하지 않은 상태에서 소스코드 또는 컴파일된 코드를 검사해 잠재적 버그, 보안 취약점, 코딩 표준 위반을 찾는 방법이다. 실행 중의 동작을 관찰하는 동적분석과 달리, 코드 자체의 구조와 규칙을 대상으로 한다.

개발 초기에 결함을 식별할 수 있고, 전체 코드베이스를 포괄적으로 검사할 수 있다는 점이 특징이다. 자동화된 검사를 지속적으로 수행할 수 있으므로 품질 관리와 결함 식별 비용 측면에서도 활용 가치가 있다.

코드 구조와 흐름을 읽는 분석 기법

구문 분석(Syntax Analysis)은 소스코드의 문법 오류를 찾아내며, 컴파일러 전단부의 작업과 유사하게 구문 트리를 만들어 코드 구조를 해석한다.

의미 분석(Semantic Analysis)은 변수 타입과 함수 호출의 정확성을 검증한다. 타입 체킹과 타입 호환성 검사를 수행하고, 선언되지 않은 변수 사용 같은 문제를 식별한다.

데이터 흐름 분석(Data Flow Analysis)은 프로그램 내부에서 데이터가 이동하는 경로를 추적한다. 초기화되지 않은 변수 사용, 불필요한 변수 선언, 메모리 누수(Memory Leak) 가능성을 탐지하는 데 쓰인다.

제어 흐름 분석(Control Flow Analysis)은 실행 경로를 분석해 도달할 수 없는 코드(Unreachable Code)나 무한 루프 가능성을 찾는다. 결함 패턴 탐지(Defect Pattern Detection)는 알려진 버그 패턴과 안티 패턴을 대조해 SQL 인젝션, XSS 같은 보안 취약점과 자원 누수(Resource Leak)를 식별한다.

목적에 따라 나뉘는 분석 도구

코드 품질 분석 도구로는 SonarQube, PMD, ESLint/TSLint가 있다. SonarQube는 코드 품질, 보안 취약점, 기술적 부채를 분석하며, PMD는 자바와 자바스크립트 등의 코드 품질 분석에 사용된다. ESLint/TSLint는 자바스크립트와 타입스크립트의 코드 스타일 및 오류를 검사한다.

보안 취약점 분석에는 Fortify, Checkmarx, Veracode가 사용된다. Fortify는 HP에서 개발한 보안 취약점 분석 도구이며, Checkmarx는 소스코드 보안 취약점 분석에 특화돼 있다. Veracode는 클라우드 기반 애플리케이션 보안 테스팅을 제공한다.

복잡한 소프트웨어의 결함과 보안 취약점에는 Coverity를, C/C++와 Java 분석에는 Klocwork를 활용할 수 있다. FindBugs/SpotBugs는 자바 바이트코드 분석 도구다.

AST에서 패턴을 찾는 방식

추상 구문 트리(AST)는 소스코드를 분석 가능한 구조로 바꾸는 핵심 표현이다. 어휘 분석과 구문 분석을 거쳐 만들어진 AST를 탐색하면서 규칙과 패턴을 대조하고, 발견된 문제를 보고한다.

소스코드어휘 분석기구문 분석기AST 생성AST 탐색 패턴 매칭문제점 보고

기호 실행(Symbolic Execution)은 실제 입력값 대신 기호적 값을 두고 프로그램 경로를 탐색한다. 분기점마다 경로 조건을 계산해 불가능한 경로와 예외 상황을 식별한다.

타입 추론(Type Inference)은 명시적인 타입 선언이 없더라도 변수의 타입을 추론한다. 이를 통해 타입 불일치 오류를 검출하고 타입 안전성(Type Safety)을 보장한다.

오탐과 미탐을 운영에서 다루는 방법

정적분석 결과는 그대로 받아들이기보다 프로젝트 맥락에서 관리해야 한다. 실제 문제가 아닌 항목을 문제로 보고하는 오탐(False Positive), 실제 문제를 놓치는 미탐(False Negative)이 발생할 수 있다. 고급 알고리즘이나 비동기 코드처럼 복잡한 로직은 분석이 어렵고, 실행 환경에 의존하는 이슈도 정적분석만으로는 식별하기 어렵다.

규칙을 프로젝트 특성에 맞게 조정하고, 동적분석을 함께 사용하면 검증 범위를 넓힐 수 있다. 지속적 통합(CI)에 분석을 연결해 개발 과정에서 자동화하고, 중요도가 높은 규칙부터 점진적으로 적용하는 방식도 현실적인 운영 방법이다.

커밋부터 배포까지 분석을 연결하는 흐름

도구는 사용하는 언어, 프로젝트 규모, 도메인에 맞춰 선정하고 분석 환경을 구성한다. 이어서 조직 또는 프로젝트의 표준에 맞는 코딩 규칙을 정의하고, 중요도에 따라 적용 우선순위를 결정한다.

CI/CD 파이프라인에서는 코드 커밋 이후 빌드와 정적분석을 수행하고, 분석 단계에서 중요 이슈가 발견되면 빌드를 실패시킬 수 있다. 이후 단위 테스트, 통합 테스트, 배포로 이어지는 흐름 안에서 분석 결과를 검토하고 반복되는 이슈 패턴을 찾아 개발자 교육과 규칙 최적화에 반영한다.

중요 이슈 발견코드 커밋빌드정적분석단위 테스트통합 테스트배포빌드 실패

적용 맥락에서 확인된 효과

금융 시스템의 보안 강화 요구에 대응해 Fortify, Checkmarx 등을 이용한 정기적 코드 스캔을 적용한 사례에서는 OWASP Top 10 취약점 90% 이상을 사전 차단하고 보안 사고 예방에 활용했다.

10년 이상 된 레거시 코드베이스를 현대화하는 과정에서는 SonarQube로 기술적 부채를 분석하고 점진적으로 개선했다. 그 결과 코드 중복률은 30% 감소했고 유지보수성은 20% 향상됐다.

의료기기와 자동차 같은 안전 중요 시스템에서는 MISRA C 규칙 기반 정적분석을 의무화할 수 있다. 안전 인증 획득 시간이 단축됐으며, 출시 후 결함 발생률은 50% 감소했다.

더 정교해지는 분석 범위

AI/ML 기반 정적분석은 딥러닝으로 코드 패턴을 인식해 오탐률을 낮추고, 코드 맥락을 이해하는 지능적 분석과 개발자 코딩 패턴 학습 기반의 맞춤형 제안으로 확장되고 있다.

DevSecOps에서는 개발·보안·운영이 결합된 과정에서 정적분석의 역할이 커진다. 요구사항 단계부터 보안 및 품질 고려점을 자동 검증하고, 컨테이너화된 애플리케이션의 보안 분석 기능도 강화되는 방향이다.

형식 검증(Formal Verification)과의 결합도 이어지고 있다. 수학적 증명 기법을 정적분석과 함께 사용해 중요 시스템의 안전성과 신뢰성을 높이고, 자율주행 차량과 우주 항공 시스템 등 고신뢰성 시스템에 적용할 수 있다.

정적분석은 단독으로 모든 결함을 발견하지는 못한다. 동적분석과 코드 리뷰 같은 검증 기법을 함께 사용하고, 개발 초기부터 CI/CD 파이프라인에 통합할 때 품질, 보안, 유지보수성 관리에 효과를 낼 수 있다.

정적분석소프트웨어 품질코드 보안CI/CD테스트