컴파일러 경고(수준 1 및 수준 4) C4700
초기화되지 않은 지역 변수 'name'이 사용됨
설명
지역 변수 이름이 사용되었습니다. 즉, 값이 할당되기 전에 읽습니다. C 및 C++에서는 지역 변수가 기본적으로 초기화되지 않습니다. 초기화되지 않은 변수는 모든 값을 포함할 수 있으며 해당 변수를 사용하면 정의되지 않은 동작이 발생합니다. 경고 C4700은 거의 항상 프로그램에서 예측할 수 없는 결과 또는 충돌을 일으킬 수 있는 버그를 나타냅니다.
이 문제를 해결하려면 지역 변수가 선언될 때 지역 변수를 초기화하거나 해당 변수가 사용되기 전에 해당 변수에 값을 할당할 수 있습니다. 함수를 사용하여 참조 매개 변수로 전달되거나 주소가 포인터 매개 변수로 전달되는 경우 변수를 초기화할 수 있습니다.
/sdl
(추가 보안 검사 사용) 컴파일러 옵션은 이 경고를 오류로 승격합니다.
예시
이 샘플에서는 변수 t
u
v
가 초기화되기 전에 사용되는 경우 C4700을 생성하고 발생할 수 있는 가비지 값의 종류를 보여 줍니다. 변수는 x
y
z
사용하기 전에 초기화되므로 경고를 발생하지 않습니다.
// c4700.cpp
// compile by using: cl /EHsc /W4 c4700.cpp
#include <iostream>
// function takes an int reference to initialize
void initialize(int& i)
{
i = 21;
}
int main()
{
int s, t, u, v; // Danger, uninitialized variables
s = t + u + v; // C4700: t, u, v used before initialization
std::cout << "Value in s: " << s << std::endl;
int w, x; // Danger, uninitialized variables
initialize(x); // fix: call function to init x before use
int y{10}; // fix: initialize y, z when declared
int z{11}; // This C++11 syntax is recommended over int z = 11;
w = x + y + z; // Okay, all values initialized before use
std::cout << "Value in w: " << w << std::endl;
}
이 코드가 실행t
되고 초기 u
v
화되지 않은 경우 출력 s
은 예측할 수 없습니다.
Value in s: 37816963
Value in w: 42