정적코드분석/코딩표준

초기화하지 않은 변수 사용 오류

‘초기화하지 않은 변수 사용 오류’는 C/C++과 같은 언어에서 변수를 초기화하지 않고 사용할 때 발생하는 문제를 말합니다. 이 오류는 프로그램 실행 중 다양한 문제를 발생시키곤 합니다. 아래 C/C++ 소스코드를 살펴보겠습니다.


#include 

int sum(int n)
{
  int total;
  int i;
  for(i = 0; i < n; i++)
  {
    total = total + 1;
  }
  return total;
}

int main()
{
  int result = 0;
  int i = 0;
  for(i = 0; i < 10; i++)
  {
    result = sum(10);
    printf("Result #%d : %d\n", i, result);
  }
  return 0;
}

sum이라는 함수는 인자로 들어온 변수 n의 값만큼 반복문을 수행하고, 결과적으로 n 의 값 만큼 리턴해주는 함수입니다. 3번째 라인을 보시면 sum 변수를 선언하면서 초기값을 설정하지 않았습니다. 그러면 sum 변수에는 예측 불가한 값이 들어갑니다. 정말 운이 좋으면 0이 들어갈 수도 있고, 이 경우에는 함수가 정상적으로 동작하겠죠. 하지만 일반적으로 이 함수는 예측 불가한 값을 리턴합니다. 따라서 이 함수를 실행할 때마다 각기 다른 값을 리턴할 것입니다.

진짜 그럴까요? 한 번 실행시켜보겠습니다. GCC 4.4.5 에서 컴파일 하고 실행시킨 결과입니다. 실행할 때마다 값이 달라지는 것을 확인할 수 있습니다. uninitvar 이런 오류를 방지하기 위해서는 반드시 변수를 선언할 때 명시적으로 초기화를 시켜주는 습관을 들여야 합니다. C/C++ 에서는 static 변수에 대해서는 0으로 자동으로 초기화하지만, 자동 변수(automatic variable)에 대해서는 자동으로 초기화시키지 않습니다. Java의 경우 초기화를 시켜주지 않아도 자동으로 해당 타입의 기본값으로 초기화됩니다. boolean 형은 false로, 정수형 타입은 0으로, 레퍼런스형에는 null로 초기화 됩니다.

해당 오류 유형에 대해서 많은 코딩 표준(MISRA, JSF, CERT 등)에서 필수적으로 언급하고 있으며 대부분의 정적 분석 도구에서 지원하고 있습니다. 이 오류는 컴파일때 검출 할 수도 있습니다. 많은 컴파일러가 명시적으로 변수를 초기화하지 않을 때 경고(warning) 혹은 에러를 발생시킵니다. gcc 를 예로 들면 “-Wuninitialized” 옵션을 줄 경우 컴파일 타임에 경고 메시지를 내보냅니다.

Leave a Reply

Leave a Reply

Your email address will not be published. Required fields are marked *