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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
-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
On 16 sep, 16:23, ld <laurent.den...@gmail.com> 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 `_WinMain@16'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 1 seconds)
1 errors, 1 warnings
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-
On 16 sep, 16:23, ld wrote:
avec -Wall -Wextra -O -Wwrite-strings -Wstrict-prototypes - Wuninitialized -Wunreachable-code
On 16 sep, 16:23, ld <laurent.den...@gmail.com> wrote:
avec -Wall -Wextra -O -Wwrite-strings -Wstrict-prototypes -
Wuninitialized
-Wunreachable-code
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 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
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 :
[richard@sonata ~]$ 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.
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.