2013-08-19 3 views
3

Je pense avoir trouvé un bogue dans VS2010 (C/C++), mais ça semble si évident, je n'arrive pas à y croire.
(dans la veine de Select isn't Broken).Un bogue Visual Studio 2010?

S'il vous plaît laissez-moi savoir si cela est un bug, ou si je manque quelque chose:

int main(void) 
{ 
    int x; // Declare a variable x; 

    for(int i=0, x = 10; i<5; ++i) // Initialize X to 10. No way around this. 
    { 
     printf("i is %d\n", i); 
    } 

    if (x == 10) // warning C4700: uninitialized local variable 'x' used  
    { 
     printf("x is ten\n"); 
    } 
} 
+9

C'est un bug. Mais pas dans votre compilateur. – Floris

+0

Je suis surpris par les votes négatifs. J'ai librement reconnu que ce n'était probablement pas un vrai bug du compilateur, et j'ai demandé ce qui me manquait. – abelenky

+2

Mais vous auriez pu tester cela en l'essayant dans un compilateur différent. Je ferais aussi votre titre plus sur votre code et moins sur le bogue apparemment plausible dans VS. – djechlin

Répondre

25
int i=0, x = 10; 

Vous venez de déclarer une deuxième variable x scope à la boucle for. La variable x externe n'est pas affectée.

+1

Vous avez raison ... Il me manquait quelque chose de simple! (mauvaise nouvelle: malgré mon simple repro-case ci-dessus, je l'ai trouvé dans un important code de production ....) – abelenky

+3

@abelenky: Et c'est pourquoi vous devriez traiter les avertissements comme des erreurs. –

+5

Longue histoire courte: je * toujours * traiter les avertissements comme des erreurs. Mon nouvel employeur a supprimé les avertissements. Je suis en train de revenir sur ces anciens avertissements supprimés et d'enquêter et de les corriger. – abelenky

0

Pour tester cela, vous devriez essayer de compiler le code dans un compilateur différent. En utilisant gcc (sans les drapeaux -Wall -Wextra -Wpedantic):

$ gcc a.c 
a.c: In function ‘main’: 
a.c:7: error: redeclaration of ‘x’ with no linkage 
a.c:5: error: previous declaration of ‘x’ was here 
a.c:7: error: ‘for’ loop initial declaration used outside C99 mode 
a.c:9: warning: too few arguments for format 
a.c:9: warning: too few arguments for format 

Comme indiqué, la question est que vous avez déclaré une variable différente avec une portée plus serré dans la boucle.