2014-06-23 2 views
4

ideone.com을 사용하여 다음과 같은 코드를 실행 :변수가 초기화되지 않은 경우 언제 오류로 throw하고 언제 가비지 값을 제공합니까?

#include <stdio.h> 

int main(void) 
{ 
    int i,j=0; 
    if(j) 
    { 
     j=0; //To suppress the warning that j is not used 
     i=1; 
    } 
    printf("%d\n",i); 
} 

출력 : 쓰레기 값 :

#include <stdio.h> 

int main(void) 
{ 
     int i; 
     if(0) 
     {   
     i=1; 
     } 
     printf("%d\n",i); 
} 

출력 : 컴파일러 (0) 블록을 제거하기 때문에

Error: unitialized local variable i used.

가인가 완전히 최적화하는 동안? 그리고 그것은 변수이므로 if (j)의 경우에는 그런 최적화를 할 수 없습니까? 컴파일 타임에 j 값이 존재하지 않고 동일한 최적화가 수행되어야합니까? 아니면 메모리가 런타임에만 할당되는 것입니까?

+1

imo, gcc (및 clang)가 i에서 초기화되지 않고 사용될 수 있음을 감지하지 못했습니다. 컴파일러는 그것을 감지 할 필요가 없지만 ideone.com은'-Werror' 플래그로 컴파일하므로, 이것을 감지 할 때 경고를내는 대신 컴파일이 실패합니다. – nos

+0

최적화 과정에서 컴파일러가 if (0) 블록을 완전히 제거하기 때문에 그렇습니까? 아마 그래. 다르게 식별하기가 어렵습니다. lint는 이와 같은 것을 결코 얻지 못했을 것입니다. –

+0

첫 번째 경우에 -O3으로 오류를 찾아 낼 수 있습니까? –

답변

3

는 지금까지 내가 Ideone이 gcc 사용하고 말할 수있는, 당신이 사용하는 코드는 경고가 될 것입니다 일반적으로 -Wuninitialized 이후 -Werror을 이용해야하지만 -Werror와 함께 사용하면 오류로 바뀔 것이다. 우리는 트리거이 경고 최적화 설정 및 gcc의 버전에 매우 의존 할 때, 그 문서가 말할 것을 볼 수있다 : 나는 컴파일러 플래그 다른 컴파일러 실험 할 때 online compilers available 내가 Coliru를 선호 모두의

Because these warnings depend on optimization, the exact variables or elements for which there are warnings depends on the precise optimization options and version of GCC used.

Note that there may be no warning about a variable that is used only to compute a value that itself is never used, because such computations may be deleted by data flow analysis before the warnings are printed.

그 (것)들을 조작하기 위하여 가장 똑 바른 앞으로 방법을 허용하기 때문에. 초기화되지 않은 변수를 사용하여 하루의 끝에서

undefined behavior이고 컴파일러가 이것에 대한 경고를 생성 할 의무가 없습니다, 후 질문 Why does this code output more than 4 lines?로 정의되지 않은 동작이 매우 예상치 못한 일을 할 수 컴파일러는 보여줍니다. ISO/IEC에서

+0

특히, 많은 경고는 이전 이후가 아니라 최적화 후에 결정됩니다.미사용 변수 경고는 사용하지 않는 기본 블록을 제거한 후에 만 ​​평가됩니다. 기본 블록이 사용되지 않는지 여부는 최적화가 얼마나 적극적인지에 달려 있습니다. –

+0

그가 gcc를 위해 특별히 묻는 곳은 어디입니까? 그 감각을 잡지 않았다 – dhein

+0

@ Zaibis 그는 내가 할 수있는 한, gcc를 사용하고있는 ideone에 사용된다. 이것은 'clang'과 다른 오류 메시지를 기반으로하며 Rextester는 Visual Studio를 사용하는 유일한 온라인 컴파일러입니다. –

2

: 9899 TC3

5.1.1.3 Diagnostics 1 A conforming implementation shall produce at least one diagnostic message (identified in an implementation-defined manner) if a preprocessing translation unit or translation unit contains a violation of any syntax rule or constraint, even if the behavior is also explicitly specified as undefined or implementation-defined. Diagnostic messages need not be produced in other circumstances.8)

그래서 요점은 컴파일러가 정의되지 않은 동작의 경우처럼 경고를 던지는 정도없는 일에 대한 무료 느낄 수있다, 그가하고 무료 느낄 수있다 그럴 경우도 마찬가지입니다.

그래서 특별한 최적화 이유가있을 수 있습니다. 하지만 어쩌면 그들은 그냥 사건을 잡을 필요가 없기 때문에 부분적으로 점검하는 그런 경우의 루틴을 가질 수 있습니다.

+1

이것은 실제로 표준에 대한 질문이 아닙니다. OP는 특정 구현이이 상황을 처리하는 방법과 이유에 대해 명확하게 묻습니다. –

+0

흠 그걸 얻지는 못 하겠지만, OPer가 나에게도 그 말을 해 주면, 나는 대답을 꺼내 줄 것이다. – dhein

+1

'최적화하는 동안 컴파일러가 if (0) 블록을 완전히 제거하기 때문에 그렇습니까? 그리고 최적화가 if (j)의 경우 변수가 아니기 때문에 수행 될 수 없습니까? '최적화를 언급하는 순간, 표준이 아닌 구현에 대해 이야기하고 있습니다. 이 대답은 훌륭하지만, 컴파일러가 원하는 모든 것을 할 수있는 이유에 대한 가장 포괄적 인 답변은 구체적인 것에 대해서는 대답하지 않습니다. –