개념
정적 테스트의 범위
정적 테스트는 프로그램을 실행하지 않고 결함을 찾는다. 사람이 하는 리뷰 와 도구가 하는 정적 분석 두 갈래다. 대상은 코드에 한정되지 않는다 — 요구사항 명세서, 설계서, 테스트 계획서, 매뉴얼 등 모든 개발 산출물 이 대상이다. 그래서 결함이 생긴 단계에서 바로 잡을 수 있고, 결함 비용 곡선(레슨 2)에서 가장 싼 구간을 공략한다.
리뷰 5종 — 목적과 주재자로 구분한다
IEEE 1028-2008은 리뷰를 다섯 가지로 나눈다.
| 유형 | 목적 | 주재 | 형식성 | 시험 키워드 |
|---|---|---|---|---|
| 관리 리뷰 | 진행 상황 모니터, 일정·인력·범위 통제와 의사 결정 | 관리자 | 중 | 계획 변경, 비상 대책 계획·진행 보고서 대상 |
| 기술 리뷰 | 계획·명세·표준 준수, 의도된 사용 적합성, 대안 검토 | 대표 엔지니어(Lead engineer) | 중 | 기술적 상태의 증거를 관리자에게 |
| 인스펙션 | 문제(Anomaly) 식별 과 해결 검증 | 훈련된 주재자(작성자 아님) | 가장 높음 | Fagan, 동료 검토, 체크리스트, 데이터 수집 |
| 워크쓰루 | 문제 식별 + 대안 조사·개선·학습(지식 공유) | 작성자 본인 | 낮음 | 작성자가 산출물을 따라가며 설명 |
| 감사 | 규제·표준·가이드라인·계획·절차 준수를 독립적으로 평가 | 대표 감사자(Lead auditor) | 높음 | 제3기관, 교정 활동 요구 |
관리 리뷰와 감사가 헷갈리면 이렇게 가른다 — 관리 리뷰는 내부의 계획 조정, 감사는 외부 기준 대비 독립 평가 다.
리뷰 프로세스 8단계
IEEE 1028은 Fagan의 인스펙션에서 출발한 공통 프로세스를 정의한다. 순서 문제가 자주 나온다.
- 경영진 준비 — 인력·설비·예산·교육 등 자원 제공
- 리뷰 계획 — 리뷰 리더가 목적 파악, 팀 구성, 책임 할당, 자료 배포, 일정 공지
- 리뷰 절차 개요 설명 — 리더 요청 시, 목적과 절차 설명
- 작업물 개요 설명 — 리더 요청 시, 검토 대상을 친숙하게(인스펙션에서는 작성자 가 수행)
- 개별 준비 — 각자 검토, 발견한 문제를 문서화해 리더에게
- 그룹 검토 — 회의에서 결과를 모아 작업물 상태에 합의
- 재작업 — 문제 목록을 작성자·책임자에게 전달해 해결
- 후속 작업 — 리더가 모든 조치 항목이 완료(Close)됐는지 확인
유형마다 적용 수준이 다르다. 예를 들어 관리 리뷰는 ④ 작업물 개요 설명을 하지 않는다. 워크쓰루는 ③·④를 회의의 일부로 다룰 수 있다. 진입 조건 확인과 종료 후 점검도 필요하다.
인스펙션의 다섯 역할과 겸직 제약
| 역할 | 하는 일 | 제약 |
|---|---|---|
| 주재자(Moderator, Inspection leader) | 참가자 선정·계획, 회의 주재, 후속 조치 결정, 보고서와 프로세스 개선 데이터 | 훈련된 퍼실리테이터. 작성자는 주재자가 될 수 없다 |
| 작성자(Author) | 자료 제출, 작업물 개요 설명, 질문 답변, 재작업 | 방어적 태도 금지. 작성자는 기록자가 될 수 없다 |
| 낭독자(Reader) | 자기 해석으로 작업물을 설명하며 회의를 이끔 | 부분별로 여러 낭독자 가능 |
| 기록자(Recorder) | 논쟁·질문·답변 기록, 문서화 | 검토자 입장에서 참여. 주재자는 기록자를 겸할 수 있다 |
| 검토자(Inspector) | 사전 검토, 결함 찾기·기록 | 해결책을 만들지 말고 의견만. 관리자는 팀 멤버 금지 |
팀 규모는 최소 2명(작성자 외 검토자·주재자)이고, 3~6명이 일반적이며 4명이 가장 이상적 이라는 자료가 있다. 6명을 넘으면 관리가 어렵다. 모든 구성원은 검토자 역할도 겸한다. 인스펙션의 목적은 작업물의 결함 발견이지 작성자 평가가 아니다.
인스펙션 고유 단계로는 주재자가 참가자에게 최소 준비 시간·희망 인스펙션 수행률(Inspection rate) ·유사 프로젝트의 문제 수를 알려 주는 절차 개요 설명이 있고, 작성자의 작업물 개요 설명 단계에서는 해결책 제안이나 결함 수정을 하지 않는다.
정적 분석 ① 코딩 표준
코딩 표준(코딩 지침)은 개발자가 지킬 규약이다. MISRA C·MISRA C++·JSF AV C++·CERT C 등이
있고, 정적 분석 도구가 위반을 자동 탐지한다. 예: 초기화되지 않은 변수 사용, 동적 메모리 할당
금지, goto 금지, 하나의 함수 출구. 안전 필수 분야(자동차·항공)에서 특히 엄격하다(s2-m35 모듈).
정적 분석 ② 순환 복잡도 (McCabe, 1976)
제어 흐름 그래프에서 선형적으로 독립인 기본 경로의 개수 다. 계산식은 세 가지이고 모두 같은 값을 낸다.
| 공식 | 쓰는 법 |
|---|---|
| V(G) = E − N + 2 | E = 간선 수, N = 노드 수 |
| V(G) = 닫힌 영역 수 + 1 | 그래프를 평면에 그려 간선이 둘러싼 영역을 센다 |
| V(G) = 분기(결정) 노드 수 + 1 | 가장 빠르다 |
코드에서 바로 세는 규칙은 if·while·for·&&·|| 마다 +1, switch 의 각 case 마다 +1,
시작값 1 이다. 복합 조건 if (x > 0 && y > 0) 은 단축 평가를 반영해 두 개의 분기로 보면
2가 아니라 3 이 된다(조건 하나당 +1). 도구에 따라 switch 를 통째로 +1 하기도 하니 문제의
가정을 읽는다.
연습 — 다음 코드의 순환 복잡도는?
int grade(int score, int bonus) {
int g = 0;
if (score >= 90 || bonus > 0) // if +1, || +1
g = 1;
for (int i = 0; i < 3; i++) // for +1
if (i == score) // if +1
g++;
return g;
}1 + 4 = 5 다. 기본 경로 테스트라면 독립 경로 5개를 덮는 TC가 필요하다는 뜻이다.
기준값도 나온다. Walsh(1979)는 10 이상에서 결함률이 크게 늘었다고 했고, HIS(독일 자동차 제조사 연합)는 10, MISRA Report 5는 15 이하, JSF AV C++ 규칙 3은 20 이하를 권한다. RIAC 표는 10 이하 수용 가능, 30 이상 의심, 50 이상 테스트 불가, 75 이상이면 고치는 작업이 새 결함을 만든다(bad fix).
정적 분석 ③ 자료 흐름 이상(Anomaly)
변수에 일어나는 일을 세 글자로 적는다 — d 정의(define, 값 할당), u 사용(use, 읽기),
k 소멸(kill, 해제·범위 종료). ~ 는 "아무것도 없음"이다(~u 는 앞에 아무 일 없이 바로 사용).
연속된 두 사건을 보고 이상 여부를 판정한다.
| 패턴 | 판정 | 이유 |
|---|---|---|
| du | 정상 | 정의하고 사용 |
| ud, uu, uk | 정상 | 사용 후 재정의·재사용·소멸 |
| kd | 정상 | 소멸 후 재정의 |
| dd | 이상(의심) | 정의한 값을 쓰지도 않고 다시 정의 — 첫 정의가 무의미 |
| dk | 이상 | 정의하고 쓰지도 않고 소멸 |
| kk | 이상 | 이미 소멸한 것을 또 소멸 |
| ku | 이상(결함) | 소멸한 변수를 사용 |
| ~u | 이상(결함) | 정의 없이 사용(초기화 누락) |
| ~k | 이상 | 정의 없이 소멸 |
| d~ | 이상(의심) | 정의하고 끝까지 사용하지 않음 |
시험 함정: "dd, kk, ~u, du 는 이상 패턴이다"(X — du는 정상). 단답형에서는 자료 흐름도를 주고 변수 하나의 이상 패턴을 쓰라고 한다. 경로를 따라 d·u·k를 순서대로 적은 뒤 연속 두 글자씩 끊어 보면 된다.
int x; // 선언만 — x 는 아직 정의되지 않음
if (flag) x = 1; // d
x = 2; // d → flag 가 참이면 dd
printf("%d", y); // y: ~u (정의 없이 사용)
free(p); free(p); // p: kk실무에서 왜 필요한가
리뷰를 유형으로 구분해 쓰면 회의가 짧아진다. "요구 명세 인스펙션"이라 공지했는데 회의가 대안 토론으로 흘러가면 그것은 워크쓰루다 — 목적을 섞으면 결함 목록도, 결정 사항도 남지 않는다. 인스펙션 역할 제약(작성자는 주재자·기록자 불가, 관리자 배제)은 심리적 안전 을 위한 것이다. 관리자가 앉아 있으면 검토자가 작성자의 결함을 덜 말하고, 작성자가 기록하면 불리한 지적이 누락된다.
순환 복잡도는 단위 테스트 범위를 협상하는 숫자다. "이 함수는 복잡도 23이라 독립 경로만 23개다,
리팩터링 없이는 단위 테스트로 덮기 어렵다"는 말은 정적 분석 리포트 한 장으로 근거가 생긴다.
자료 흐름 이상(~u, ku)은 초기화 누락·해제 후 사용 결함으로, 보안 취약점(CWE-457, CWE-416)과
직결된다(s3-m53-l04).