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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #2177801
À (at) Fri, 4 Apr 2008 02:59:10 -0700 (PDT),
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.


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 -
Rémi Moyen
Le #2180301
On Apr 4, 11:08 am, Paul Gaborit
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


L'option '-Wshadow' fait exactement cela...


Super, c'est bien ça ! J'avais cherché dans le man avec des trucs
autour de "hide", "overload", "redefine", j'avais pas pensé à
"shadow".

J'étais persuadé qu'elle
était activée par '-Wall' mais ce n'est pas le cas.


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


Paul Gaborit
Le #2182821
À (at) Fri, 4 Apr 2008 03:42:10 -0700 (PDT),
Rémi Moyen
Histoire d'élargir un peu la discussion, quels sont vos warnings
"préférés" que vous ajoutez fréquemment (ou systématiquement) ?


'-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 -
Matthieu Moy
Le #2182801
Paul Gaborit
À (at) Fri, 4 Apr 2008 03:42:10 -0700 (PDT),
Rémi Moyen
Histoire d'élargir un peu la discussion, quels sont vos warnings
"préférés" que vous ajoutez fréquemment (ou systématiquement) ?


'-Wall' ! ;-)


Aussi -Wextra, vu que « all » ne se traduit pas par « tous » dans la
terminologie gcc ;-).

--
Matthieu


Paul Gaborit
Le #2182781
À (at) Fri, 04 Apr 2008 13:41:43 +0200,
Matthieu Moy
Paul Gaborit
À (at) Fri, 4 Apr 2008 03:42:10 -0700 (PDT),
Rémi Moyen
Histoire d'élargir un peu la discussion, quels sont vos warnings
"préférés" que vous ajoutez fréquemment (ou systématiquement) ?


'-Wall' ! ;-)


Aussi -Wextra, vu que « all » ne se traduit pas par « tous » dans la
terminologie gcc ;-).


-Wextra non plus d'ailleurs puisque ça n'active toujours pas -Wshadow !

--
Paul Gaborit -


Thierry B.
Le #2185711
--{ Rémi Moyen a plopé ceci: }--

bête de copier-coller


ah...

Je me dis que g++ devrait être capable de m'avertir de ce genre


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

Rémi Moyen
Le #2185701
On Apr 4, 1:12 pm, "Thierry B."
--{ Rémi Moyen a plopé ceci: }--

bête de copier-coller


  ah...

Je me dis que g++ devrait être capable de m'avertir de ce genre


  gcc n'a pas d'interface avec le neurone des yusers.


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


Paul Gaborit
Le #2185691
À (at) Fri, 4 Apr 2008 14:12:03 +0200,
"Thierry B."
--{ Rémi Moyen a plopé ceci: }--

bête de copier-coller


ah...

Je me dis que g++ devrait être capable de m'avertir de ce genre


gcc n'a pas d'interface avec le neurone des yusers.


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 -

R
Le #2185681
Paul Gaborit wrote:
� (at) Fri, 4 Apr 2008 03:42:10 -0700 (PDT),
R�mi Moyen
Histoire d'�largir un peu la discussion, quels sont vos warnings
"pr�f�r�s" que vous ajoutez fr�quemment (ou syst�matiquement) ?



[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.]

'-Wall' ! ;-)


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.

Pour les autres, c'est au cas par cas.


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


Alain Ketterlin
Le #2188281
Paul Gaborit
Je me dis que g++ devrait être capable de m'avertir de ce genre


gcc n'a pas d'interface avec le neurone des yusers.


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


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



Publicité
Poster une réponse
Anonyme