김종하 파수닷컴 선임

▲ 김종하 파수닷컴 선임 [PA사업팀 EA팀] http://story.wisedog.net/

[아이티데일리] ‘초기화하지 않은 변수 사용 오류’는 C/C++과 같은 언어에서 변수를 초기화하지 않고 사용할 때 발생하는 문제를 말합니다. 이 오류는 프로그램 실행 중 다양한 문제를 발생시키곤 합니다.

아래 C/C++ 소스코드를 살펴보겠습니다.

<pre>#include <stdio.h>

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

int main()
{
int result = 0;
int i = 0;
for(i = 0; i &lt; 10; i++)
{
result = sum(10);
printf("Result #%d : %dn", i, result);
}
return 0;
}
</pre>

sum이라는 함수는 인자로 들어온 변수 n의 값만큼 반복문을 수행하고, 결과적으로 n 의 값 만큼 리턴해주는 함수입니다. 3번째 라인을 보시면 sum 변수를 선언하면서 초기값을 설정하지 않았습니다. 그러면 sum 변수에는 예측 불가한 값이 들어갑니다.

정말 운이 좋으면 0이 들어갈 수도 있고, 이 경우에는 함수가 정상적으로 동작하겠죠. 하지만 일반적으로 이 함수는 예측 불가한 값을 리턴합니다. 따라서 이 함수를 실행할 때마다 각기 다른 값을 리턴할 것입니다.

진짜 그럴까요? 한 번 실행시켜보겠습니다. GCC 4.4.5 에서 컴파일 하고 실행시킨 결과입니다. 실행할 때마다 값이 달라지는 것을 확인할 수 있습니다.

 

이런 오류를 방지하기 위해서는 반드시 변수를 선언할 때 명시적으로 초기화를 시켜주는 습관을 들여야 합니다.

C/C++ 에서는 static 변수에 대해서는 0으로 자동으로 초기화하지만, 자동 변수(automatic variable)에 대해서는 자동으로 초기화시키지 않습니다. Java의 경우 초기화를 시켜주지 않아도 자동으로 해당 타입의 기본값으로 초기화됩니다. boolean 형은 false로, 정수형 타입은 0으로, 레퍼런스형에는 null로 초기화 됩니다.

해당 오류 유형에 대해서 많은 코딩 표준(MISRA, JSF, CERT 등)에서 거의 필수적으로 언급하고 있는 사항입니다. 이 오류는 컴파일 때 검출 할 수도 있습니다. 많은 컴파일러가 명시적으로 변수를 초기화하지 않을 때 경고(warning) 혹은 에러를 발생시킵니다.

컴파일러뿐만 아니라 정적 코드 분석 도구 역시 이런 오류 유형을 탐지합니다. 파수닷컴의 정적 코드 분석도구 스패로우에서도 UNINIT 체커를 통해서 이와 같은 오류 유형을 잡아낼 수 있습니다.

 

 

해당 글은 파수닷컴에서 아이티데일리 게재용으로 제공한 콘텐츠입니다.
저작권은 파수닷컴 측에 있으며, 무단전제 및 복제를 금합니다.
원문출처 : http://blog.fasoo.com/80211692191

저작권자 © 아이티데일리 무단전재 및 재배포 금지