 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
GOURUL Frédéric Guest
|
Posted: Wed Jul 28, 2004 6:13 pm Post subject: code buggé mais valide ??? |
|
|
Bonjour à tous,
Après avoir passé un peu de temps à la recherche de ce bug, je m'interroge
sur le mutisme de mon compilateur.
std::string foo(std::string& s)
{
std::cout << s << endl;
return std::string("code buggé");
}
std::string r = foo(r);
Bien sur, le code étant légèrement plus subtile que ca, mais en gros c'était
ca... Evidemment ca ne peut pas marcher, on passe en paramètre de foo() une
reférence sur un objet encore non construit, puisque le résultat de foo est
justement le paramètre du constructeur de r...
Ce qui m'étonne, c'est qu'aucun des compilateurs avec lequels j'ai testé ce
code (VC++, gcc, HP-UX aCC) n'a emis la moindre erreur ou warning. Ce qui
m'étonne d'autant plus de la part de VC++ qui est légèrement paranoïaque
question warning a mon goût... Alors pourquoi ce silence ? Je n'ai pas
l'impression que le cas soit particulièrement complexe à détecter, cela
signifirait-il que bien que buggé, le code soit valide vis-à-vis de la norme
?
votre avis ?
Fred.
|
|
| Back to top |
|
 |
Nico Guest
|
Posted: Wed Jul 28, 2004 7:37 pm Post subject: Re: code buggé mais valide ??? |
|
|
"GOURUL Frédéric" <fgourul.nospam (AT) 9online (DOT) fr> a écrit dans le message de
news:ce8qbi$bpd$1 (AT) apollon (DOT) grec.isp.9tel.net...
| Quote: | Bonjour à tous,
Après avoir passé un peu de temps à la recherche de ce bug, je m'interroge
sur le mutisme de mon compilateur.
std::string foo(std::string& s)
{
std::cout << s << endl;
return std::string("code buggé");
}
std::string r = foo(r);
Bien sur, le code étant légèrement plus subtile que ca, mais en gros
c'était
ca... Evidemment ca ne peut pas marcher, on passe en paramètre de foo()
une
reférence sur un objet encore non construit, puisque le résultat de foo
est
justement le paramètre du constructeur de r...
|
Pour moi ce n'est pas tout a fait ca :
foo n'est pas le paramètre du constructeur de r.
la ligne "std::string r = foo(r);" est plutot équivalente à "std::string r;
r = foo(r);"
Ce dont je ne suis pas sur, c'est si ta ligne a un comportement défini ou
non.
|
|
| Back to top |
|
 |
GOURUL Frédéric Guest
|
Posted: Wed Jul 28, 2004 9:11 pm Post subject: Re: code buggé mais valide ??? |
|
|
"Nico" <nvervell (AT) club-internet (DOT) fr> a écrit dans le message de
news:41080270$0$306$7a628cd7 (AT) news (DOT) club-internet.fr...
| Quote: |
Pour moi ce n'est pas tout a fait ca :
foo n'est pas le paramètre du constructeur de r.
la ligne "std::string r = foo(r);" est plutot équivalente à "std::string
r;
r = foo(r);"
|
Non, ici c'est bien le constructeur de std::string qui est appelé avec comme
paramètre le résultat de foo(). La notation est un peu trompeuse et lorsque
je l'ai écrit, j'ai pensé, sans y réfléchir, que c'était l'operateur
d'affectation qui était appelé, alors que ce n'est pas le cas...
| Quote: | Ce dont je ne suis pas sur, c'est si ta ligne a un comportement défini ou
non.
|
pour moi, c'est bien un comportement indéfini. En tout cas, sur les trois
compilateurs testés et assure d'ailleurs un plantage assez rapide...
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Wed Jul 28, 2004 9:55 pm Post subject: Re: code buggé mais valide ??? |
|
|
GOURUL Frédéric wrote:
| Quote: | Bonjour à tous,
Après avoir passé un peu de temps à la recherche de ce bug, je m'interroge
sur le mutisme de mon compilateur.
std::string foo(std::string& s)
{
std::cout << s << endl;
return std::string("code buggé");
}
std::string r = foo(r);
|
Le comportement est bien indéfini.
--
Loïc
|
|
| Back to top |
|
 |
Horst Kraemer Guest
|
Posted: Thu Jul 29, 2004 8:04 pm Post subject: Re: code buggé mais valide ??? |
|
|
"GOURUL Frédéric" <fgourul.nospam (AT) 9online (DOT) fr> wrote:
| Quote: | Bonjour à tous,
Après avoir passé un peu de temps à la recherche de ce bug, je m'interroge
sur le mutisme de mon compilateur.
std::string foo(std::string& s)
{
std::cout << s << endl;
return std::string("code buggé");
}
std::string r = foo(r);
Bien sur, le code étant légèrement plus subtile que ca, mais en gros c'était
ca... Evidemment ca ne peut pas marcher, on passe en paramètre de foo() une
reférence sur un objet encore non construit, puisque le résultat de foo est
justement le paramètre du constructeur de r...
Ce qui m'étonne, c'est qu'aucun des compilateurs avec lequels j'ai testé ce
code (VC++, gcc, HP-UX aCC) n'a emis la moindre erreur ou warning. Ce qui
m'étonne d'autant plus de la part de VC++ qui est légèrement paranoïaque
question warning a mon goût... Alors pourquoi ce silence ? Je n'ai pas
l'impression que le cas soit particulièrement complexe à détecter, cela
signifirait-il que bien que buggé, le code soit valide vis-à-vis de la norme
?
|
Non. Le code n'est pas valide parce que son conportement est indéfini.
Mais la norme n'interdit pas au compilateur de compiler du code dont
la syntaxe est légale et dont le comportement est indéfini.
La norme est explicite: Le compilateur n'est pas obligé de découvrir
des erreurs sémantiques dans des cas où la norme dit "no diagnostic
required" ou bien "le comportement est indéfini". Il n'est donc obligé
que de découvrir des erreurs sémantiques que la norme marque
explicitement comme "diagnosable" - et ce n'est pas le cas ici.
--
Horst
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|