 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Philippe Guglielmetti Guest
|
Posted: Thu Aug 19, 2004 1:05 pm Post subject: empêcher la compilation de 'x'+"yz" ? |
|
|
J'ai perdu des heures à chasser un bug stupide du style
std::string bad='x'+"yz"; // donne tout sauf "xyz"
("yz" était en fait le résultat d'une conversion genre class::operator
char*() ...)
Existe-t-il une combine pour empêcher C++ de compiler des bêtises à la C ?
J'ai essayé de définir un operator+(const char lhs, const char* rhs) qui
râlerait, mais VC 7.1 dit qu'une des deux opérandes doit être une classe...
--
Philippe Guglielmetti - www.dynabits.com
|
|
| Back to top |
|
 |
Alni Guest
|
Posted: Thu Aug 19, 2004 4:06 pm Post subject: Re: empêcher la compilation de 'x'+"yz" ? |
|
|
Bonjour,
Philippe Guglielmetti <news (AT) dynabits (DOT) com> a écrit :
| Quote: | J'ai perdu des heures à chasser un bug stupide du style
std::string bad='x'+"yz"; // donne tout sauf "xyz"
|
'x' n'est pas une string. Tu ne peux pas l'additionner avec "yz" pour le
mettre dans une std::string. C'est un char, soit une valeur comprise
entre 0 et 255. Au mieux il sera peut être interprété par le compilo
comme étant la string à l'adresse 0x120.
Il faut écrire
std::string bad="x"+"yz";
Pour obtenir "xyz"
|
|
| Back to top |
|
 |
Christophe de VIENNE Guest
|
Posted: Thu Aug 19, 2004 4:14 pm Post subject: Re: empêcher la compilation de 'x'+"yz" ? |
|
|
Alni a écrit :
| Quote: | Bonjour,
Philippe Guglielmetti <news (AT) dynabits (DOT) com> a écrit :
J'ai perdu des heures à chasser un bug stupide du style
std::string bad='x'+"yz"; // donne tout sauf "xyz"
'x' n'est pas une string. Tu ne peux pas l'additionner avec "yz" pour le
|
"x" non plus, c'est un char[2]
| Quote: | mettre dans une std::string. C'est un char, soit une valeur comprise
entre 0 et 255. Au mieux il sera peut être interprété par le compilo
comme étant la string à l'adresse 0x120.
Il faut écrire
std::string bad="x"+"yz";
Pour obtenir "xyz"
|
Non, là tu additionnes des pointeurs. Si tu veux que l'opérateur + de
std::string soit utilisé et obtenir une concaténation, il faut écrire :
std::string bad = std::string("x") + "yz";
A+
Christophe
--
Christophe de Vienne
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Aug 19, 2004 4:14 pm Post subject: Re: empêcher la compilation de 'x'+"yz" ? |
|
|
On Thu, 19 Aug 2004 18:06:23 +0200, "Alni" <nospam (AT) nowhere (DOT) com>:
| Quote: | 'x' n'est pas une string.
|
Il s'en doute. Mais justement, le problème est de forcer le compilo à
râler dans de tels cas.
| Quote: | Tu ne peux pas l'additionner avec "yz" pour le
mettre dans une std::string. C'est un char, soit une valeur comprise
entre 0 et 255. Au mieux il sera peut être interprété par le compilo
comme étant la string à l'adresse 0x120.
|
Non. 'x'+"yz" est ici égal à "xy"+'x', soit "xy"+0x78 -- 120
caractères après le début de la chaîne. Ce qui n'est bien sûr pas
valide, en plus de ne pas donner le résultat escompté ;-)
| Quote: | Il faut écrire
std::string bad="x"+"yz";
|
Ça marche, ça, tu crois ? ;-)
--
;-)
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Aug 19, 2004 4:17 pm Post subject: Re: empêcher la compilation de 'x'+"yz" ? |
|
|
On Thu, 19 Aug 2004 18:17:25 +0200, "Jean-Noël Mégoz"
<nospam_jnmegoz (AT) infonie (DOT) fr>:
| Quote: | Ça m'étonne, d'ailleurs, qu'une telle
instruction ne provoque pas au moins un warning...
|
Ben oui, pointeur+entier, c'est la même chose que pointeur[entier], ou
entier[pointeur], ou entier+pointeur.
--
;-)
|
|
| Back to top |
|
 |
Jean-Noël Mégoz Guest
|
Posted: Thu Aug 19, 2004 4:17 pm Post subject: Re: empêcher la compilation de 'x'+"yz" ? |
|
|
"Alni" <nospam (AT) nowhere (DOT) com> a écrit dans le message de
news:cg2j5u$ukj$1 (AT) news-reader2 (DOT) wanadoo.fr...
| Quote: | Bonjour,
Philippe Guglielmetti <news (AT) dynabits (DOT) com> a écrit :
J'ai perdu des heures à chasser un bug stupide du style
std::string bad='x'+"yz"; // donne tout sauf "xyz"
'x' n'est pas une string. Tu ne peux pas l'additionner avec "yz" pour le
mettre dans une std::string. C'est un char, soit une valeur comprise
entre 0 et 255. Au mieux il sera peut être interprété par le compilo
comme étant la string à l'adresse 0x120.
Il faut écrire
std::string bad="x"+"yz";
Pour obtenir "xyz"
L'auteur du post initial le sait bien ! Ce qu'il demande, c'est s'il y a |
moyen que le compilo détecte ce genre de bug.
Pour ma part, je n'en sais rien ! Ça m'étonne, d'ailleurs, qu'une telle
instruction ne provoque pas au moins un warning...
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Aug 19, 2004 4:18 pm Post subject: Re: empêcher la compilation de 'x'+"yz" ? |
|
|
On Thu, 19 Aug 2004 18:14:49 +0200, Christophe de VIENNE
<cdevienne (AT) alphacent (DOT) com>:
| Quote: | std::string bad = std::string("x") + "yz";
|
En fait, non : il faut écrire
std::string good= std::string("x") + "yz";
puisque cette fois, ça marche.
--
;-)
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Aug 19, 2004 4:20 pm Post subject: Re: empêcher la compilation de 'x'+"yz" ? |
|
|
On Thu, 19 Aug 2004 15:05:13 +0200, "Philippe Guglielmetti"
<news (AT) dynabits (DOT) com>:
| Quote: | Existe-t-il une combine pour empêcher C++ de compiler des bêtises à la C ?
|
A priori, non. Mais il n'est pas impossible que certains compilos
génèrent un warning (modulo l'option qui va bien).
--
;-)
|
|
| Back to top |
|
 |
Alni Guest
|
Posted: Thu Aug 19, 2004 4:22 pm Post subject: Re: empêcher la compilation de 'x'+"yz" ? |
|
|
Bonjour,
Jean-Noël Mégoz <nospam_jnmegoz (AT) infonie (DOT) fr> a écrit :
| Quote: | L'auteur du post initial le sait bien ! Ce qu'il demande, c'est s'il
y a moyen que le compilo détecte ce genre de bug.
OK...pas compris... |
| Quote: | Pour ma part, je n'en sais rien ! Ça m'étonne, d'ailleurs, qu'une
telle instruction ne provoque pas au moins un warning...
|
Mouais, effectivement, je viens de tester en VC++ 6, pas de warning.
Même pas un assert à l'execution.
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Thu Aug 19, 2004 4:45 pm Post subject: Re: empêcher la compilation de 'x'+"yz" ? |
|
|
"Alni" <nospam (AT) nowhere (DOT) com> writes:
| Quote: | Philippe Guglielmetti <news (AT) dynabits (DOT) com> a écrit :
J'ai perdu des heures à chasser un bug stupide du style
std::string bad='x'+"yz"; // donne tout sauf "xyz"
'x' n'est pas une string. Tu ne peux pas l'additionner avec "yz" pour
le mettre dans une std::string. C'est un char, soit une valeur
comprise entre 0 et 255. Au mieux il sera peut être interprété par le
compilo comme étant la string à l'adresse 0x120.
|
Si je ne me trompe pas, le résultat est un char const *, pointant à
l'adresse de "yz" augmentée de la valeur entière 'x'.
| Quote: | Il faut écrire
std::string bad="x"+"yz";
|
Non.
| Quote: | Pour obtenir "xyz"
|
Non, ni pour obtenir "xyz", ni pour rien, d'ailleurs.
~> cat fclcxx.cc
#include <iostream>
#include <ostream>
#include <string>
int main() {
std::string s = "x" + "yz" ;
std::cout
<< s
<< std::endl ;
}
~> g++ -o fclcxx fclcxx.cc -Wall -ansi -pedantic
fclcxx.cc: In function `int main()':
fclcxx.cc:5: error: invalid operands of types `const char[2]' and
`const char[3]' to binary `operator+'
~> cat fclcxx.cc
#include <iostream>
#include <ostream>
#include <string>
int main() {
std::string s1 = std::string( "x" ) + "yz" ;
std::string s2( "x" ) ;
s2 += "yz" ;
std::cout
<< s1
<< std::endl
<< s2
<< std::endl ;
}
~> g++ -o fclcxx fclcxx.cc -Wall -ansi -pedantic
~> ./fclcxx
xyz
xyz
--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Thu Aug 19, 2004 4:52 pm Post subject: Re: empêcher la compilation de 'x'+"yz" ? |
|
|
Fabien LE LEZ wrote:
| Quote: |
Existe-t-il une combine pour empêcher C++ de compiler des bêtises à la C ?
A priori, non. Mais il n'est pas impossible que certains compilos
génèrent un warning (modulo l'option qui va bien).
|
Avec 'gcc -Wall', j'ai bien un warning "array subscript has type `char'"
quand je fais
std::string bad = &'x'["yz"];
(qui est fonctionellement équivalent à
std::string bad = 'x' + "yz";
mais il me ne semble pas avoir de moyen pour faire générer un
warning dans ce cas)
Ce sont les joies de l'arithmétique des pointeurs combiné aux
règles loufoques de conversion tableau => pointeur, qui font
que le code en question *doit* être accepté par le compilateur,
bien qu'il produise un comportement indéfini.
Falk
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Aug 19, 2004 5:13 pm Post subject: Re: empêcher la compilation de 'x'+"yz" ? |
|
|
On Thu, 19 Aug 2004 18:45:36 +0200, drkm <usenet.fclcxx (AT) fgeorges (DOT) org>:
| Quote: | Si je ne me trompe pas, le résultat est un char const *, pointant à
l'adresse de "yz" augmentée de la valeur entière 'x'.
|
Et rien n'empêche un compilo de servir un café au lait, puisqu'il
s'agit d'un comportement indéfini.
--
;-)
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Thu Aug 19, 2004 5:31 pm Post subject: Re: empêcher la compilation de 'x'+"yz" ? |
|
|
Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:
| Quote: | On Thu, 19 Aug 2004 18:45:36 +0200, drkm <usenet.fclcxx (AT) fgeorges (DOT) org>:
Si je ne me trompe pas, le résultat est un char const *, pointant à
l'adresse de "yz" augmentée de la valeur entière 'x'.
Et rien n'empêche un compilo de servir un café au lait, puisqu'il
s'agit d'un comportement indéfini.
|
Le problème est qu'il peut également te le servir avec du sel en
guise de sucre, ce qui le fait moins bien passer ;-)
Mais si je comprend bien, le comportement indéfini vient du fait que
l'on sort des bornes du tableau (et du « one past the end »). Mais
ceci aurait le résultat escompté :
char c = 5 ;
std::string s = c + "12345xyz" ;
Non ?
--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Aug 19, 2004 5:43 pm Post subject: Re: empêcher la compilation de 'x'+"yz" ? |
|
|
On Thu, 19 Aug 2004 19:31:20 +0200, drkm <usenet.fclcxx (AT) fgeorges (DOT) org>:
| Quote: | Le problème est qu'il peut également te le servir avec du sel en
guise de sucre, ce qui le fait moins bien passer
|
De toutes façons, je déteste le café, qu'il soit sucré ou salé. Même
avec des frites.
| Quote: | Mais si je comprend bien, le comportement indéfini vient du fait que
l'on sort des bornes du tableau (et du « one past the end »).
|
Oui.
| Quote: | Mais
ceci aurait le résultat escompté :
char c = 5 ;
std::string s = c + "12345xyz" ;
|
"Escompté" ne me paraît pas convenir ici -- le résultat "logique"
serait "512345xyz". Mais le fait est que ce code met bien "xyz" dans
s.
--
;-)
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Thu Aug 19, 2004 7:47 pm Post subject: Re: empêcher la compilation de 'x'+"yz" ? |
|
|
Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:
| Quote: | On Thu, 19 Aug 2004 19:31:20 +0200, drkm <usenet.fclcxx (AT) fgeorges (DOT) org>:
Mais ceci aurait le résultat escompté :
char c = 5 ;
std::string s = c + "12345xyz" ;
"Escompté" ne me paraît pas convenir ici -- le résultat "logique"
serait "512345xyz". Mais le fait est que ce code met bien "xyz" dans
s.
|
Lorsque je disais « escompté », je me référais à l'exemple du PO et
au résultat qu'il pensait obtenir.
Je ne sais pas s'il y a un résultat plus logique que l'autre. Si
l'on suppose que l'auteur des deux lignes de code ci-dessus connait
son affaire, je pense que le résultat /escompté/ est bien "xyz".
Mais il est vrai qu'a priori, si je vois ces mêmes lignes de code,
je ne dirais pas que son auteur connait son affaire.
--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html
|
|
| 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
|
|