5

나는이 코드 조각이에 초기화되지 않은 변수가 사용되는 것은 분명하다는, VC++

#include <iostream> 

void foo(int *a) 
{ 
    std::cout<<*a<<std::endl; 
} 

int main() 
{ 
    int i; 
    foo(&i); 
} 

을 초기화되지 않은 변수를 결정합니다.

나는 과 마찬가지로 error C4700을 사용했지만 위의 코드에서 컴파일러가 오류로 표시하지 않았습니다.

또한 코드 분석을 실행 해 보았습니다. 문제가 없도록 코드 조각으로보고했습니다.

소스 코드에서 초기화되지 않은 변수를 확인하는 신뢰할 수있는 방법은 무엇입니까?

나는 여기에 멋진 일을한다. 그러나 나는 윈도우 API와 MFC에 대한 많은 호출을 가지고 있기 때문에 나를위한 옵션이 아니다.

+2

그것은 당신이 "분명"입니다하지만 컴파일러 : 당신은 포인터 간접 통해 (인라인이 아닌) 함수에 변수를 전달 (함수 인라인을하고 인라인을 활성화하면 GCC와 경고를 트리거 않습니다). 이제 대답이 아니라 처음에 초기화되지 않은 변수를 정의하는 이유는 무엇입니까? 문제를 피하는 간단한 방법은 변수를 정의 할 때 항상 초기화하는 것입니다 (초기화 할 때까지 변수를 정의하지 않아야 함을 의미 함). –

+0

@gx_ : 초기화되지 않은 변수를 정의하는 것이 아니라 가능한 문제에 대한 코드 기반을 갖는 코드베이스를 살균하는 것입니다. 또한 나는 "당신에게"분명하지만 컴파일러에게는 그렇지 않다 "라고 반대합니다. 내 요점을 증명하기 위해 나는 위의 코드베이스에 대해 Valgrind를 실행하고 응답을 결정해야합니다. – Abhijit

+0

답장을 보내 주셔서 감사합니다 ("내 코드가 아닐 것"이라고 의심했지만 정확한 답변은 없었습니다). 그러나 나는 컴파일러에 대해 분명히 분명하지 않다. (foo 인라인을 만들고 _ 컴파일러에게 명백하게). 또한 valgrind는 컴파일러도 아니고 정적 분석 도구가 아니라 _dynamic_ 체커입니다. –

답변

1

초기화되지 않은 변수의 모든 경우를 컴파일러가 결정할 수있는 확실한 방법은 없습니다. Valgrind (및 그와 같은 다른 도구)는 컴파일러가 아니지만 사용자 gx과 같은 동적 분석 도구는 위와 같습니다. 단위 화 된 변수를 사용하는 많은 경우를 감지 할 수있는 정적 분석 도구도 있습니다. 그러나 일반적으로 컴파일러는 이러한 특수 도구와 일치하지 않습니다.

1

정적 분석 부분에 관해서 : 다른 정적 분석 도구에 액세스 할 수 있다면 VS2013 기준으로 기본 분석기가 너무 많이 잡히지 않을 것입니다. (VS를 사용하여 다른 사람이 놓칠 수있는 것을 잡아내는 것이 좋지만). 여기서는 그렇지 않겠지 만 정적 분석기는 여러 곳에서 볼 수 있거나 다른 개발자가 허용 할 수있는 표준으로 덮어 쓴 패턴을 무시할 수 있습니다. Coverity가이 사건을보고하지 않았다면 놀랄 것입니다. (죄송합니다. 테스트를 위해 ATM을 설치하지 마십시오.) 만약 그것을 무시했다면, 가능한 공유 메모리 주소로 간주 될 수 있습니다.

+0

Coverity (적어도 내 설정에서)이 중 하나를 잡지 못했습니다. 외관상으로는 분석의 기능 깊이는 아주 제한됩니다. 초기화되지 않은 변수의 다른 경우에는 일반적으로 컴파일 프로세스가이를 catch하므로 아마도 그 프로세스가 의존합니다. 재미있는 경우는 추측하지 못했을 것입니다. – dwn