C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

empêcher la compilation de 'x'+"yz" ?
Goto page 1, 2, 3, 4  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Philippe Guglielmetti
Guest





PostPosted: Thu Aug 19, 2004 1:05 pm    Post subject: empêcher la compilation de 'x'+"yz" ? Reply with quote



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





PostPosted: Thu Aug 19, 2004 4:06 pm    Post subject: Re: empêcher la compilation de 'x'+"yz" ? Reply with quote



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





PostPosted: Thu Aug 19, 2004 4:14 pm    Post subject: Re: empêcher la compilation de 'x'+"yz" ? Reply with quote



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





PostPosted: Thu Aug 19, 2004 4:14 pm    Post subject: Re: empêcher la compilation de 'x'+"yz" ? Reply with quote

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





PostPosted: Thu Aug 19, 2004 4:17 pm    Post subject: Re: empêcher la compilation de 'x'+"yz" ? Reply with quote

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





PostPosted: Thu Aug 19, 2004 4:17 pm    Post subject: Re: empêcher la compilation de 'x'+"yz" ? Reply with quote


"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





PostPosted: Thu Aug 19, 2004 4:18 pm    Post subject: Re: empêcher la compilation de 'x'+"yz" ? Reply with quote

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





PostPosted: Thu Aug 19, 2004 4:20 pm    Post subject: Re: empêcher la compilation de 'x'+"yz" ? Reply with quote

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





PostPosted: Thu Aug 19, 2004 4:22 pm    Post subject: Re: empêcher la compilation de 'x'+"yz" ? Reply with quote

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





PostPosted: Thu Aug 19, 2004 4:45 pm    Post subject: Re: empêcher la compilation de 'x'+"yz" ? Reply with quote

"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





PostPosted: Thu Aug 19, 2004 4:52 pm    Post subject: Re: empêcher la compilation de 'x'+"yz" ? Reply with quote

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





PostPosted: Thu Aug 19, 2004 5:13 pm    Post subject: Re: empêcher la compilation de 'x'+"yz" ? Reply with quote

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





PostPosted: Thu Aug 19, 2004 5:31 pm    Post subject: Re: empêcher la compilation de 'x'+"yz" ? Reply with quote

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





PostPosted: Thu Aug 19, 2004 5:43 pm    Post subject: Re: empêcher la compilation de 'x'+"yz" ? Reply with quote

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 Wink

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





PostPosted: Thu Aug 19, 2004 7:47 pm    Post subject: Re: empêcher la compilation de 'x'+"yz" ? Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2, 3, 4  Next
Page 1 of 4

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.