2017-11-15 15 views
4
#include <ios> 
#include <iostream> 
#include <map> 

using namespace std; 

int main() { 
    ios_base::sync_with_stdio(false); 
    map<int, int> v; 
    int i; 
    int t; 
    while (cin >> i) { 
    v[i] = t++; 
    } 
    auto mi = i; 
    auto mt = t; 
    for (const auto p : v) { 
    if (p.second < mt) { 
     mi = p.first; 
     mt = p.second; 
    } 
    } 
    cout << mi << '\n'; 
    return 0; 
} 

위의 프로그램은 초기화되지 않은 변수 t을 많이 사용하지만 GCC는 -Wall 또는 -Wuninitialized로보고하지 않습니다. 왜 그래야만하지?GCC가 초기화되지 않은 변수를보고하지 않는 이유는 무엇입니까?

그것은 연타 그것을 잡는다 있음을 주목할 필요가있다 :

main.cpp:13:12: warning: variable 't' is uninitialized when used here [-Wuninitialized] 
    v[i] = t++; 
     ^

사용 g ++ (GCC) 7.2.1 20170915 (레드햇 7.2.1-2).

사용 된 clang 버전 4.0.1 (태그/RELEASE_401/최종). 당신이 때해야 https://godbolt.org/g/kmYMC1에서 GCC 7.2도를보고하지 않습니다 볼 수 있듯이


. 나는 GCC의 이슈 트래커에서 티켓을 만들 것이다.

+4

이 수행합니다 https://godbolt.org/g/3CZ6kT –

+1

@ tobi303 누르는 작은 "경고 삼각형"을 아이콘 왼쪽 하단에 어셈블리 출력 –

답변

2

변수의 값을 추적하는 논리가 최적화 시스템의 일부이기 때문에 GCC는 최적화가 활성화 된 경우에만 초기화되지 않은 변수를 감지 할 수 있습니다.

당신이 -O -Wall 컴파일하면 경고 얻을 :

<source>: In function 'int main()': 
12 : <source>:12:13: warning: 't' may be used uninitialized in this function [-Wmaybe-uninitialized] 
    v[i] = t++; 
      ~^~ 
Compiler exited with result code 0 

https://godbolt.org/g/327bsi

7

경고 플래그가 -Wuninitialized 인 경우 : -Wmaybe-uninitialized이라고합니다.

또한 as Jonathan Wakely noted in his answer, g ++는 최적화가 활성화 된 경우에만 초기화되지 않은 변수의 사용을 감지 할 수 있습니다. -Wmaybe-initalized-Wall-Wextra 모두 기본적으로 활성화되어 https://godbolt.org/g/3CZ6kT

하는 것으로 : 모두 -Wmaybe-initalized 및 최적화를 활성화

이 예상되는 경고를 생성합니다.

+0

가 표시됩니다. 그러나 맨 페이지에는 "자동 변수가 처음 초기화되거나 변수가"setjmp "호출에 의해 위태로워 질 수있는 경우 경고합니다."자동으로 초기화 될 때 원인이되는 것 같아요. ? –

+0

관련 컴파일러 탐색기 (GCC 7.2 포함) : https://godbolt.org/g/dQAAqQ –

+1

@BernardoSulzbach : 예, 경고가 표시됩니다. 이 예제를 최소화하고 gcc 버그 추적기에 대한 버그 보고서를 작성하는 것이 좋습니다. –