Warning de g++ pour redéfinition de variable ?
Le
Rémi Moyen

Bonjour,
Dans mon code C++, il m'arrive de temps à autres de faire une erreur
bête de copier-coller et d'avoir (typiquement) deux boucles imbriquées
qui utilisent involontairement le même indice (par exemple parce que
j'ai copié la boucle interne d'un autre endroit du code et que j'ai
oublié de changer son indice), genre :
for (int i = 0; i < n; ++i) {
for (int i = 0; i < m; ++i) { // Oops, it's supposed to be j
here !
}
}
Je me dis que g++ devrait être capable de m'avertir de ce genre
d'erreurs, parce que ça me semble quand même être une construction qui=
doit être une erreur du programmeur dans la très grande majorité des
cas, et que ça ne me semble pas très difficile à détecter.
Mais j'ai cherché rapidement (peut-être trop) dans le man de g++,
sans trouver de flag qui permette de forcer un warning dans des cas
comme ça. J'ai mal cherché ou ça existe pas ?
Merci d'avance !
--
Rémi Moyen
Dans mon code C++, il m'arrive de temps à autres de faire une erreur
bête de copier-coller et d'avoir (typiquement) deux boucles imbriquées
qui utilisent involontairement le même indice (par exemple parce que
j'ai copié la boucle interne d'un autre endroit du code et que j'ai
oublié de changer son indice), genre :
for (int i = 0; i < n; ++i) {
for (int i = 0; i < m; ++i) { // Oops, it's supposed to be j
here !
}
}
Je me dis que g++ devrait être capable de m'avertir de ce genre
d'erreurs, parce que ça me semble quand même être une construction qui=
doit être une erreur du programmeur dans la très grande majorité des
cas, et que ça ne me semble pas très difficile à détecter.
Mais j'ai cherché rapidement (peut-être trop) dans le man de g++,
sans trouver de flag qui permette de forcer un warning dans des cas
comme ça. J'ai mal cherché ou ça existe pas ?
Merci d'avance !
--
Rémi Moyen
Rémi Moyen
L'option '-Wshadow' fait exactement cela... J'étais persuadé qu'elle
était activée par '-Wall' mais ce n'est pas le cas.
--
Paul Gaborit -
Super, c'est bien ça ! J'avais cherché dans le man avec des trucs
autour de "hide", "overload", "redefine", j'avais pas pensé à
"shadow".
Oui, c'est aussi ce que je me suis dit au début et j'ai été surpris
que ce ne soit pas le cas !
Histoire d'élargir un peu la discussion, quels sont vos warnings
"préférés" que vous ajoutez fréquemment (ou systématiquement) ?
En tout cas, merci pour ta réponse rapide.
--
Rémi Moyen
Rémi Moyen
'-Wall' ! ;-)
Pour les autres, c'est au cas par cas. Pour savoir tout ce qui existe :
gcc -v --help
C'est regroupé par langage (avec une section pour les options communes
à tous les langages).
--
Paul Gaborit -
Aussi -Wextra, vu que « all » ne se traduit pas par « tous » dans la
terminologie gcc ;-).
--
Matthieu
Matthieu Moy
-Wextra non plus d'ailleurs puisque ça n'active toujours pas -Wshadow !
--
Paul Gaborit -
ah...
gcc n'a pas d'interface avec le neurone des yusers.
--
$ cat / | od -t a | head -n 3
0000000 stx nul nul nul ff nul soh nul . nul nul nul stx nul nul nul
0000020 ff nul stx nul . . nul nul vt nul nul nul dc4 nul nl nul
0000040 l o s t + f o u n d nul nul O eot nul nul
Peut-être, mais il a -Wshadow qui fait exactement ce que je demande et
que certains ont été assez gentils pour m'indiquer. Ce qui est un peu
plus utile que de regarder de haut quelqu'un qui a le malheur de faire
une erreur (parce que si on commence comme ça, -Wunused et plein
d'autres aussi sont inutiles).
--
Rémi Moyen
"Thierry B."
Formellement, il n'est ni interdit ni complètement idiot de réutiliser
plusieurs fois le même nom de variable. Ça peut même arriver sans
faire de "bête" copier/coller : par exemple via une macro. C'est donc
normal que 'gcc' ne considère pas cela comme une erreur ni même un
warning. Ensuite, on peut considérer que ce n'est pas une bonne
pratique. D'où l'option -Wshadow...
--
Paul Gaborit -
[Oups, y'en a un de nous deux qui a un problème avec les accents...
j'avoue, j'utilise Google Groups depuis le bureau, c'est donc peut-
être bien moi.]
Oui, bien sûr. En fait, j'aurais dû préciser "warnings en plu s de -
Wall" :-)
Note que déjà -Wextra, je sais pas pourquoi, je l'utilise pas. Fau dra
que je vérifie.
Ben justement, c'est un peu ça qui m'intéresse. La liste est telle ment
longue, et parfois un peu difficile à comprendre que j'aimerais bien
savoir ceux qui, dans l'experience des gens sont :
- utiles ;
- et ne génèrent pas trop de faux positif.
Évidemment, je conçois bien que ce soit au cas par cas, certains
projets/styles/équipes/... n'auront pas les même choix, ou que
certains warnings soient vraiment spécifique. Mais par exemple, le -
Wshadow, j'ai un peu du mal à imaginer des situations où ce soit u n
choix volontaire et véritablement logique de redéfinir une variabl e
(le seul exemple que je trouve est avec des macros, mais c'est de
toute façon du code sale à mon avis). Je suppose qu'il y en a d'au tres
(en plus de -Wall) qui sont sans doute utilisables "tout le temps par
défaut sauf quand un cas particulier justifie qu'on ne les mette pas".
Enfin, c'est ma vision des choses, je me plante peut-être...
--
Rémi Moyen
Tout à fait d'accord.
Au fait, avec le code suivant (non, il ne me semble pas idiot) :
for ( int i=0 ; i<10 ; i++ )
for ( int i=i+1 ; i<10 ; i++ )
printf("%dn",i);
Ca part dans le décor. A mon avis ca ne devrait pas. Le problème vient
de l'initalisation (int i=i+1;) dont le i en rhs n'est pas le bon :
c'est "le nouveau" qui est pris, pas "l'ancien". Dommage. Dans ce cas,
il vaudrait mieux que -Wshadow soit dans -Wall.
-- Alain.
P/S: je vois des adeptes de la programmation fonctionnelle qui
rigolent...