Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

warning et UB.

4 réponses
Avatar
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: =91b=92 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 =3D b;

ce qui est pire. Pas cool...

a+, ld.

-------

int foo(void)
{
int a =3D 1;

retry:

{
int b;

if (a < 0)
return b;

b =3D a, a =3D -a;
}

goto retry;
}

4 réponses

Avatar
-ed-
On 16 sep, 16:23, ld wrote:
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
Avatar
-ed-
On 16 sep, 16:23, ld wrote:

avec -Wall -Wextra -O -Wwrite-strings -Wstrict-prototypes -
Wuninitialized
-Wunreachable-code
Avatar
ld
On 17 sep, 09:35, -ed- wrote:
On 16 sep, 16:23, ld wrote:

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.
Avatar
Richard Delorme
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