ㅈㄱㅈ/ㅊㄴㅅㄴ

정적테스팅 자료 흐름 쓰임새 패턴

SBP 2025. 4. 30. 06:22
정적 테스팅 자료 흐름 쓰임새 패턴

정적 테스팅에서의 자료 흐름 쓰임새 패턴 📊

정적 테스팅의 자료 흐름 분석은 코드를 실행하지 않고 변수의 정의(Define), 사용(Use), 소멸(Undefine/Kill) 상태를 추적하여 잠재적인 오류를 찾아내는 기법입니다. 다음은 주요 자료 흐름 쓰임새 패턴 또는 이상(anomalies)입니다.


1. 정의-정의 (DD: Define-Define) 경로 🔁

변수가 정의된 후, 그 값이 사용되기 전에 다시 정의되는 경우입니다.

설명: 이 패턴은 첫 번째 정의가 불필요했거나, 프로그래머의 논리적 오류일 가능성을 나타냅니다. 이전 값이 사용되지 않고 덮어쓰이므로 코드의 효율성을 저해하거나 의도치 않은 동작의 원인이 될 수 있습니다.

예시 코드:


int count = 0;  // 첫 번째 정의 (count)
// ... 다른 코드 ...
count = 10; // 두 번째 정의 (count) - 이전 0 값은 사용되지 않음
printf("%d", count); // count 사용
            

잠재적 문제점:

  • 불필요한 연산 또는 할당.
  • 코드를 혼란스럽게 만들고 유지보수를 어렵게 함.
  • 초기 할당 로직의 오류 가능성.

2. 정의-소멸 (DUndef/DKill: Define-Undefine/Kill) 경로 (미사용 변수) 🗑️

변수가 정의되었지만, 한 번도 사용되지 않고 변수의 유효 범위(scope)를 벗어나거나 명시적으로 메모리에서 해제되는 경우입니다.

설명: "죽은 코드(dead code)"의 한 형태로, 프로그램의 성능에 미미한 영향을 줄 수 있으며, 코드의 가독성을 떨어뜨리고 혼란을 야기할 수 있습니다.

예시 코드:


void processData() {
    int tempData = fetchData(); // 정의 (tempData)
    int result = 0;
    // tempData 변수는 이후 사용되지 않고 함수 종료 시 소멸됨
    if (someCondition) {
        result = 1;
    }
    printf("%d", result);
}
            

잠재적 문제점:

  • 코드 가독성 저하 및 오해 유발.
  • 유지보수 시 불필요한 분석 대상이 됨.
  • (경미하지만) 메모리 낭비 또는 불필요한 초기화 연산.

3. 미정의-사용 (UndefU: Undefine-Use) 경로 (초기화되지 않은 변수 사용) ❓

변수가 정의(선언)는 되었으나 값이 할당(초기화)되기 전에 사용되거나, 이미 소멸된 변수를 사용하려고 하는 경우입니다.

설명: 이는 가장 심각한 자료 흐름 이상 중 하나로, 예측 불가능한 프로그램 동작이나 런타임 오류(예: null pointer dereference, 쓰레기 값 사용)를 직접적으로 유발합니다.

예시 코드:


void printValue() {
    int value; // 정의 (선언) (value) - 초기화되지 않음
    // ...
    printf("%d", value); // 사용 (value) - 초기화되지 않은 값을 읽으려 함
    value = 100;
}
            

잠재적 문제점:

  • 런타임 오류 또는 프로그램 비정상 종료.
  • 예측 불가능한 동작 및 잘못된 결과 도출.
  • 보안 취약점 발생 가능성 (예: 정보 노출).

4. 정의-사용 (DU: Define-Use) 경로 (정상 경로) ✅

변수가 정의(또는 초기화)된 후, 그 값이 올바르게 사용되는 가장 일반적이고 정상적인 자료 흐름입니다.

설명: 정적 분석 도구는 이 DU 경로가 명확하게 존재하는지 확인하여, 변수가 선언된 의도대로 사용되고 있는지를 검증합니다. 다른 이상 패턴들은 이 DU 경로가 없거나 잘못되었을 때 주로 발생합니다.

예시 코드:


int age = 30; // 정의 및 초기화 (age)
// ...
if (age >= 18) { // 사용 (age)
    printf("Adult");
}
            

중요성:

  • 코드의 기본적인 데이터 흐름을 나타내며, 프로그램 로직의 정확성을 판단하는 기준이 됩니다.
  • 모든 유효한 변수는 최소 하나 이상의 DU 경로를 가지는 것이 일반적입니다 (사용되지 않는 변수 제외).

이러한 자료 흐름 쓰임새 패턴(이상)을 식별하고 분석함으로써, 개발자는 코드를 실행하기 전에 잠재적인 결함을 조기에 발견하고 수정하여 소프트웨어의 품질과 안정성을 높일 수 있습니다.