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 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