2017-11-15 5 views
4

Das oben erwähnte Programm verwendet stark eine nicht initialisierte Variable t, aber GCC meldet es nicht mit -Wall oder -Wuninitialized. Wieso ist es so?Warum meldet GCC keine nicht initialisierte Variable?

Es ist erwähnenswert, dass Clang es fängt:

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

Gebraucht g ++ (GCC) 7.2.1 20.170.915 (Red Hat 7.2.1-2).

Verwendete Klangversion 4.0.1 (tags/RELEASE_401/final).


Wie Sie in https://godbolt.org/g/kmYMC1 GCC 7.2 sehen können es nicht berichtet, auch wenn es sein sollte. Ich werde ein Ticket im GCC-Tracker anlegen.

+4

Es tut: https://godbolt.org/g/3CZ6kT –

+1

@ tobi303: Drücken Sie die kleine "Warndreieck" Symbol in der unteren linken Ecke der Baugruppe Ausgang –

Antwort

2

GCC kann nur nicht initialisierte Variablen erkennen, wenn die Optimierung aktiviert ist, da die Logik zum Verfolgen der Werte von Variablen Teil der Optimierungsmaschinerie ist.

Wenn Sie mit -O -Wall Sie eine Warnung kompilieren:

<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

g ++ 's Warnung Flag nicht -Wuninitialized genannt: es -Wmaybe-uninitialized genannt wird.

Auch as Jonathan Wakely noted in his answer, g ++ kann die Verwendung von nicht initialisierten Variablen nur erkennen, wenn Optimierungen aktiviert sind. beide aktiviert ist mit https://godbolt.org/g/3CZ6kT

Beachten Sie, dass -Wmaybe-initalized standardmäßig -Wall und -Wextra:

Aktivieren beide -Wmaybe-initalized und Optimierungen erzeugt die erwartete Warnung.

+0

Ich sehe. Aber die man-Seite dafür lautet: "Warne, wenn eine automatische Variable verwendet wird, ohne dass sie vorher initialisiert wurde, oder wenn eine Variable durch einen" setjmp "-Aufruf verstopft ist.", Was die Ursache zu sein scheint, wenn ein Auto damit initialisiert wird ? –

+0

Relevanter Compiler-Explorer (mit GCC 7.2): https://godbolt.org/g/dQAAqQ –

+1

@BernardoSulzbach: Ja, das sollte wahrscheinlich eine Warnung auslösen. Ich schlage vor, das Beispiel zu minimieren und einen Fehlerbericht über den gcc bug tracker zu erstellen. –

Verwandte Themen