GCC-Wuninitialized / -Wmaybe-non initialisée questions
Je suis en train de vivre une très étrange question à l'aide de gcc-4.7 (Ubuntu/Linaro 4.7.2-11precise2) 4.7.2
. Je ne suis pas en mesure de compiler les suivantes code valable sans un avertissement:
extern void dostuff(void);
int test(int arg1, int arg2)
{
int ret;
if (arg1) ret = arg2 ? 1 : 2;
dostuff();
if (arg1) return ret;
return 0;
}
Options de compilation et de sortie:
$ gcc-4.7 -o test.o -c -Os test.c -Wall
test.c: In function ‘test’:
test.c:5:6: warning: ‘ret’ may be used uninitialized in this function [-Wmaybe-uninitialized]
Cependant, le code suivant compile sans warning (quoiqu'un peu moins efficace assemblée):
extern void dostuff(void);
int test(int arg1, int arg2)
{
int ret;
if (arg1 && arg2) ret = 1;
if (arg1 && !arg2) ret = 2;
dostuff();
if (arg1) return ret;
return 0;
}
Je suis un peu coincé et j'envisage ce un bug du compilateur. Toutes les pensées?
Tu veux sans doute dire
Non, la syntaxe est très bien. Je veux dire, retourne 0 si
Faire ret
Grâce Alok, mais peut-être cette construits exemple produira erronée des solutions. Code de la densité est extrêmement important ici, et dans la fonction réelle
ret == arg2 ? 1 : 2;
??Non, la syntaxe est très bien. Je veux dire, retourne 0 si
arg1=0, arg2=0
, retourne 1 si arg1=1, arg2=1
, retour 2 si arg1=1, arg2=0
. Cet extrait est un cas simplifié d'un problème beaucoup plus vaste que je vais avoir.Faire ret
volatile
résout également le problème, mais n'est pas vraiment idéal.int ret;
ne signifie pas ret == 0
, Si vous modifiez int ret = 0;
qui devrait résoudre votre problème et de s'adapter correctement dans votre logique. Le code de ce que vous avez à l'heure actuelle, n'est pas initialiser ret
à 0
.ret
a une période Indéterminée, de valeur, car il est local/auto variable qui n'est pas explicitement initialisée.Mais cela ne répond pas à l'anomalie sous-jacente.Grâce Alok, mais peut-être cette construits exemple produira erronée des solutions. Code de la densité est extrêmement important ici, et dans la fonction réelle
ret
est un grand tableau dont je ne veux pas initialiser si elle n'est pas utilisée. En regardant mon premier programme, ret est en effet jamais utilisé non initialisée, si l'avertissement est incorrect, non?OriginalL'auteur user593062 | 2013-01-03
Vous devez vous connecter pour publier un commentaire.
En effet c'est un problème connu dans gcc.
gcc est tristement célèbre pour les rapports incorrect variables non initialisées.
Ces lacunes ont été dûment pris note et il y a une initiative visant à combler les lacunes:
Mieux Non Initialisée Avertissements:
L'initiative vise à offrir de meilleures mises en garde et il cite un exemple de cas similaires, comme votre cas. La partie pertinente:
OriginalL'auteur Alok Save