warning et UB.

Le
ld
le code ci-dessous ne donne pas de warning avec gcc 4.x et toutes les
options -W et -pedantic. Cependant le meme code plonge dans une masse
de code (un foo tres touffu), gcc me donne le warning:

warning: ‘b’ may be used uninitialized in this function

et il a raison. Le probleme, c'est que le warning est plus ou moins
alleatoire, c'est-a-dire que j'ai du mal a extraire le cas "minimum"
qui declenche le warning. Alors pourquoi sur un cas aussi simple il ne
voit pas le probleme?

De plus si le warning apparait, il se tait si on remplace

int b;

par le UB

int b = b;

ce qui est pire. Pas cool

a+, ld.

-

int foo(void)
{
int a = 1;

retry:

{
int b;

if (a < 0)
return b;

b = a, a = -a;
}

goto retry;
}
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
-ed-
Le #20163371
On 16 sep, 16:23, ld
le code ci-dessous ne donne pas de warning avec gcc 4.x et toutes les
options -W et -pedantic. Cependant le meme code plonge dans une masse
de code (un foo tres touffu), gcc me donne le warning:

warning: ‘b’ may be used uninitialized in this function

et il a raison. Le probleme, c'est que le warning est plus ou moins
alleatoire, c'est-a-dire que j'ai du mal a extraire le cas "minimum"
qui declenche le warning. Alors pourquoi sur un cas aussi simple il ne
voit pas le probleme?

De plus si le warning apparait, il se tait si on remplace

int b;

par le UB

int b = b;

ce qui est pire. Pas cool...

a+, ld.

-------

int foo(void)
{
  int a = 1;

retry:

  {
    int b;

    if (a < 0)
            return b;

    b = a, a = -a;
  }

  goto retry;

}




-------------- Build: Debug in hello ---------------

Compiling: main.c
Linking console executable: binDebughello.exe
C:devhellomain.c: In function `foo':
C:devhellomain.c:8: warning: 'b' might be used uninitialized in
this function
C:Program FilesCodeBlocksMinGWlib/libmingw32.a(main.o):main.c:
(.text+0x104): undefined reference to `'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 1 seconds)
1 errors, 1 warnings
-ed-
Le #20163521
On 16 sep, 16:23, ld
avec -Wall -Wextra -O -Wwrite-strings -Wstrict-prototypes -
Wuninitialized
-Wunreachable-code
ld
Le #20164611
On 17 sep, 09:35, -ed-
On 16 sep, 16:23, ld
avec -Wall -Wextra -O -Wwrite-strings -Wstrict-prototypes -
Wuninitialized
-Wunreachable-code



Merci pour le test.

Et que ce passe-t-il si tu ajoutes

int b = b;

il rale ou il se tait?

(je n'ai pas windows mais il faudra bien que je l'installe un jour
pour faire des tests...)

Merci encore.

a+, ld.
Richard Delorme
Le #20165011
Le 16/09/2009 16:23, ld a écrit :
le code ci-dessous ne donne pas de warning avec gcc 4.x et toutes les
options -W et -pedantic.



Idem chez moi.

Avec d'autres compilateurs sur Linux :

* icc 11.0 (le compilo d'intel) donne, en réglage par défaut :

foo.c(11): warning #592: variable "b" is used before its value is set
return b;
^
avec int b = b; on obtient :

[ ~]$ icc -c foo.c
foo.c(8): warning #592: variable "b" is used before its value is set
int b = b;
^


* clang-cc ne donne aucun warning.


* Splint (pas un compilateur, mais un vérificateur de code) donne (en
mode standard) :

foo.c: (in function foo)
foo.c:11:13: Variable b used before definition
An rvalue is used that may not be initialized to a value on some
execution path. (Use -usedef to inhibit warning)

et avec int b = b;

foo.c: (in function foo)
foo.c:8:13: Variable b used before definition
An rvalue is used that may not be initialized to a value on some
execution path. (Use -usedef to inhibit warning)


AMHA, on a, à défaut de bug, un mauvais comportement de gcc (et
clang-cc) ici.

--
Richard
Publicité
Poster une réponse
Anonyme