2017-09-28 6 views
14

Encore une fois une erreur variable non initialisée stupide dans How to fix this segmentation error in a sequence inverting program?. Alors j'allais répéter le commentaire "veuillez utiliser -Wall flags", mais quand j'ai testé le code contre les avertissements, je n'ai trouvé aucun avertissement signalé à ma grande surprise.pourquoi je ne reçois pas un avertissement "utilisé non initialisé" de gcc dans cet exemple trivial?

Je rognée vers le bas à ce ci-dessous (ce code n'a pas de sens à des fins d'exécution, mais il illustre ce que je veux montrer):

#include <stdio.h> 

int main() 
{ 

    int i,len=12; 

    /* printf("%d\n",i); */ 

    while(i!=len-1) 
    { 

    i++; 
    len--; 
    } 

return 0; 
} 

lors de la compilation à l'aide gcc 4.7.3 et 6.2.1 en utilisant

gcc -Wall -Wextra -pedantic 

Je reçois aucun avertissement, alors que i est manifestement pas initialisés avant d'utiliser dans la boucle while.

Maintenant, si je décommenter la déclaration printf je reçois:

warning: 'i' is used uninitialized in this function [-Wuninitialized] 

Alors pourquoi l'avertissement émis lors du passage i-printf mais pas dans le test while?

(Il est différent de gcc failing to warn of uninitialized variable parce que, dans mon cas, il n'y a pas de branches)

(sons comme un bug, mais il est si trivial que je me demande si je ne manque pas quelque chose d'énorme.)

+0

pourquoi ne pas attribuer i = 0? –

+11

@ Dr.Geek avez-vous lu la question? – bolov

+0

Obtenez-vous des résultats différents si vous forcez des versions spécifiques de la norme de langue via -std = ....? – SirDarius

Répondre

7

il est difficile de dire que c'est un bug , car gcc mêle le code pour l'optimisation et la création de mises en garde, qui est même documentée pour cet avertissement particulier:

-Wuninitialized
Avertir si une variable automatique est utilisée sans être initialisée ou si une variable peut être modifiée par un appel setjmp. [...]
Parce que ces avertissements dépendent de l'optimisation, les variables exactes ou éléments pour lesquels il y a des avertissements dépend des options d'optimisation précises et version de GCC utilisées.

(de la documentation de gcc Options to Request or Suppress Warnings, Souligné par l'auteur)

Vous avez trouvé une IMHO cas très stupide ici. Essayez -O1 et vous obtiendrez un avertissement inattendu:

warn.c: In function ‘main’: 
warn.c:13:6: warning: ‘i’ may be used uninitialized in this function [-Wmaybe-uninitialized] 
    i++; 
    ^

Ainsi, gcc manque encore la première utilisation non initialisée, mais trouve le second! Essayez -O0 ou -O2 et l'avertissement est à nouveau parti ...

Vous pouvez toujours essayer de générer un bogue à ce sujet. Remarque clang obtient le droit:

warn.c:10:9: warning: variable 'i' is uninitialized when used here 
     [-Wuninitialized] 
    while(i!=len-1) 
     ^
warn.c:6:8: note: initialize the variable 'i' to silence this warning 
    int i,len=12; 
    ^
     = 0 
1 warning generated. 
+2

il y a déjà un bug pour ça: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=18501 – bolov

+1

Je pense sérieusement à laisser tomber gcc maintenant ... merci. –

+0

@bolov intéressant;) Mais la façon dont gcc documente cet avertissement rend très difficile de dire que c'est effectivement un bug ... –