 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Alain Gaillard Guest
|
Posted: Fri Aug 18, 2006 9:11 am Post subject: size_t, bug dans VC++2005 ? |
|
|
Bonjour à tous,
Je voudrais amener la discussion sur un post que j'ai lu dans
comp.lang.c++.moderated.
Quelqu'un pose une question à partir d'un éventuel bug de VC++ 2005 et
la discussion ne semble pas trancher catégoriquement.
Soit ce code:
int main()
{
size_t n = 8;
return n;
}
Notez bien l'absence de tout include.
VC++ 2005 compile ça sans broncher.
Pourtant selon 18.1 (draft 2005) il semble bien clair que size_t est
défini dans cstddef, lequel sur ce point est identique à stddef.h.
Il me semble bien que le standard C dit sans ambiguïté que stddef.h contient
typedef unsigned int size_t;
Encore plus étonnant, le stddef.h de VC++, inclus par cstddef ne
contient même pas le typedef (à moins que je n'ai la berlue)
AMHA le compilateur n'a pas à connaître size_t avant qu'on le lui ai
déclaré, et AMHA toujours c'est clairement un bug.
Qu'en pensez vous ?
--
Alain |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Sun Aug 20, 2006 8:51 pm Post subject: Re: size_t, bug dans VC++2005 ? |
|
|
Fabien LE LEZ wrote:
| Quote: | On Fri, 18 Aug 2006 11:00:49 +0200, Alain Gaillard
alain_gaillard28 (AT) hotmail (DOT) fr>:
Il me semble bien que le standard C dit sans ambiguïté que
stddef.h contient typedef unsigned int size_t;
|
Ainsi que <stdlib.h> et <string.h> (et peut-être d'autres que
j'oublie).
| Quote: | Et le standard C++, que dit-il ?
|
Que c'est pareil à C, sauf qu'un en-tête C++ peut en inclure un
autre. Inclure <string>, par exemple, et c'est prèsque sûr que
tu auras size_t aussi.
| Quote: | Je ne l'ai pas sous la main, mais le Stroustrup (6.2.6.2) me
dit qu'un prototype de new est :
void * operator new (size_t);
Étant donné que new est accessible sans avoir besoin d'inclure le
moindre en-tête, ne devrait-il pas en aller de même pour size_t ?
|
D'abord, size_t est un typedef. Ce qui veut dire que « void*
operator new( size_t ) » n'est qu'une façon de le déclarer --
la seule façon portable, en l'occurance, mais selon le système,
« void* operator new( unsigned int ) » ou « void* operator
new( unsigned long ) » serait aussi légal. A priori, le
compilateur lui-même utilise une de ces définitions. Le
compilateur sait le type qui résulte d'un sizeof -- le
véritable type, et non le typedef qui le déclare. Il n'a aucun
problème à utiliser ce type dans sa déclaration implicite de la
fonction operator new. Ensuite, c'est le problème de
l'implémenteur de la bibliothèque de s'assurer que le typedef
dans <stddef.h> et les autres correspond à ce que fait le
compilateur, et non l'inverse.
| Quote: | Même question pour std::exception, puisque new peut lancer une
exception.
|
C'est un argument plus valid. En effet, le compilateur est
obligé à connaître quelques classes de la bibliothèque, sans que
le moindre en-tête soit inclu. std::type_info est de loin le
plus essentiel, mais il faut aussi qu'il sache au moins que la
fonction operator new peut lever une exception qui s'appelle
std::bad_alloc.
D'après ce que j'ai compris, il doit garder ces informations
secrète, et ne les utiliser que dans les cas bien définis, et
que c'est au charge de la bibliothèque de fournir des
définitions compatibles, et que le programmeur n'en a accès qu'à
travers les définitions dans les en-têtes. (Je dis compatible,
et non identique, parce que j'imagine que dans la plupart des
compilateurs, type_info ait plutôt l'air d'une structure POD,
qu'on initialise statiquement comme un POD. En fait, il l'en
faut, parce qu'une classe définie comme l'est std::type_info
dans la norme, c'est impossible d'en avoir une instance.)
En somme, la norme définit ce qu'il faut, et l'implémentation se
débrouille pour qu'on l'a. Mais l'implémentation ne peut pas
être écrit elle en C++ conforme et 100% portable.
--
James Kanze kanze.james (AT) neuf (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Alain Gaillard Guest
|
Posted: Mon Aug 21, 2006 9:12 am Post subject: Re: [Question résolue] size t, bug dans VC++2005 ? |
|
|
Alain Gaillard a écrit :
Je pense avoir résolu la question.
En cherchant dans le standard (draft 2005). Au verset 3.7.3-2 je vois
qu'un programme qui fait référence à std::size_t sans avoir inclus
l'en-tête correspondant est mal formé. Comme a prioiri, selon 1.4-8, une
implémentation doit rejeter un programme mal formé, VC++ 2005 est buggé.
--
Alain |
|
| Back to top |
|
 |
Alain Gaillard Guest
|
Posted: Mon Aug 21, 2006 9:12 am Post subject: Re: size_t, bug dans VC++2005 ? |
|
|
James Kanze a écrit :
| Quote: | Ainsi que <stdlib.h> et <string.h> (et peut-être d'autres que
j'oublie).
|
Sans doute, mais du point de vue du standard C++, car c'est bien le
point de départ, seul cstddef et donc stddef.h sont pris ne compte pour
size_t.
Quoi qu'il en soit je pense avoir résolu la question. Voir mon autre post.
--
Alain |
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Mon Aug 21, 2006 3:19 pm Post subject: Re: [Question résolue] size_t, bug dans VC++2005 ? |
|
|
On Mon, 21 Aug 2006 11:55:36 +0200, Alain Gaillard
<alain_gaillard28 (AT) hotmail (DOT) fr>:
| Quote: | Cela étant si j'en crois 1.3.3 et
1.5.2 le compilo *doit* émettre un message dans notre cas.
|
C'est bizarre, je croyais avoir compris que l'affichage des messages
était laissé à l'entière discrétion de l'implémenteur. |
|
| Back to top |
|
 |
Alain Gaillard Guest
|
Posted: Mon Aug 21, 2006 3:33 pm Post subject: Re: [Question résolue] size t, bug dans VC++2005 ? |
|
|
Fabien LE LEZ a écrit :
| Quote: | C'est bizarre, je croyais avoir compris que l'affichage des messages
était laissé à l'entière discrétion de l'implémenteur.
|
Il y a bel et bien des cas où le compilateur est tenu d'émèttre un message.
Dans le cas présent par contre je n'en suis pas certain et si quelqu'un
qui connait le standard sur le bout des doigts voulait donner un avis
circontancié, ça serait super.
--
Alain |
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Mon Aug 21, 2006 5:11 pm Post subject: Re: [Question résolue] size_t, bug dans VC++2005 ? |
|
|
Alain Gaillard <alain_gaillard28 (AT) hotmail (DOT) fr> writes:
| Gabriel Dos Reis a écrit :
|
|
| > La norme ne dit pas qu'il doit refuser de compiler le programme :
| > juste émettre un diagnostic. Maintenant, ce qui constitue un diagnostic
| > est laissé à l'appréciation de l'implémentation.
|
| Oui c'est vrai. J'ai manqué de précision. Je n'aurais pas du dire
| "rejeter" radicalement effectivement. Cela étant si j'en crois 1.3.3
| et 1.5.2 le compilo *doit* émettre un message dans notre cas. Et alors
| après oui, il peut accepter de compiler ou non.
|
| Mais comme VC++2005 n'émet strictement aucun message il devrait
| rejeter ce code, donc il est buggué. C'est en tout cas comme ça que je
| lit le standard. Ais je tort Gaby ?
non. Comme j'ai dit, ce qui constitue un diagnostic est laissé à la
discrétion de l'implémentation. Mais tu as raison sur le fond.
-- Gaby |
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Tue Aug 22, 2006 2:37 am Post subject: Re: [Question résolue] size t, bug dans VC++2005 ? |
|
|
Alain Gaillard a écrit :
| Quote: | Fabien LE LEZ a écrit :
C'est bizarre, je croyais avoir compris que l'affichage des messages
était laissé à l'entière discrétion de l'implémenteur.
Il y a bel et bien des cas où le compilateur est tenu d'émèttre un message.
|
Oui. Mais si je fais un compilateur où comme j'indique que mon message
sera constitué d'une chaîne vide en cas d'erreur, et d'une chaîne vide
en cas de succès, je pense que j'ai formellement rempli les contraintes
du standard.
--
Loïc |
|
| Back to top |
|
 |
Dominique Vaufreydaz Guest
|
Posted: Tue Aug 22, 2006 9:11 am Post subject: [HS] size_t, bug dans VC++2005 ? |
|
|
Bonjour,
| Quote: | Chaîne vide, je ne sais pas, mais c'est vrai que rien n'impose
qu'on puisse distinguer le message d'un message qui apparaît par
ailleurs. Strictement parlant, le script :
#! /bin/sh
echo '?'
|
Donc vertain message "francisé" (j'ai pas dit traduits) du compilo
de visual studio sont donc tout a fait dans la norme. Ouf ! Parcequ'il y
en a certains qui craignent quand meme (pour essayer de comprendre
ce qui ne va pas !).
Doms. |
|
| Back to top |
|
 |
kanze Guest
|
Posted: Tue Aug 22, 2006 9:11 am Post subject: Re: [Question résolue] size t, bug dans VC++2005 ? |
|
|
Loïc Joly wrote:
| Quote: | Alain Gaillard a écrit :
Fabien LE LEZ a écrit :
C'est bizarre, je croyais avoir compris que l'affichage des
messages était laissé à l'entière discrétion de
l'implémenteur.
Il y a bel et bien des cas où le compilateur est tenu
d'émèttre un message.
Oui. Mais si je fais un compilateur où comme j'indique que mon
message sera constitué d'une chaîne vide en cas d'erreur, et
d'une chaîne vide en cas de succès, je pense que j'ai
formellement rempli les contraintes du standard.
|
Chaîne vide, je ne sais pas, mais c'est vrai que rien n'impose
qu'on puisse distinguer le message d'un message qui apparaît par
ailleurs. Strictement parlant, le script :
#! /bin/sh
echo '?'
est un compilateur C++ tout à fait conforme, à condition de
documenter que '?' est un diagnostique. (Qui pourrait signifie,
parmi d'autre chose, un dépassement des limites des ressources.
C'est un compilateur qui limite l'utilisation des ressources à
un point où même "hello, world" les dépasse.)
Il faut se rappeler aussi qu'une fois la diagnostique émise, le
comportement est indéfini. Un compilateur qui reformatte le
disque dur chaque fois qu'il y a une erreur dans ton code est
aussi conforme. Je crois même qu'il pourrait documenter que le
message d'erreur, c'est l'allumage du voyant sur le disque.
Dans la pratique, évidemment, de tels compilateurs ne risquent
pas de prendre une partie importante du marché.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Dominique Vaufreydaz Guest
|
Posted: Tue Aug 22, 2006 9:11 am Post subject: Re: [Question résolue] size_t, bug dans VC++2005 ? |
|
|
Bonjour,
| Quote: | Mais comme VC++2005 n'émet strictement aucun message il devrait
rejeter ce code, donc il est buggué. C'est en tout cas comme ça que
je lit le standard. Ais je tort Gaby ?
|
Non, il ne supporte pas toute la norme... D'ailleurs est-ce qu'il y a
un compilo qui respecte toute la norme ? A ma connaissance non.
Pour le compilo de Visual C++, microsoft affirme respecter 98%
(de memoire) de la norme.
Notons aussi que le message peut etre present peut-etre si le niveau
de warning est augmente ?
Doms. |
|
| Back to top |
|
 |
kanze Guest
|
Posted: Tue Aug 22, 2006 9:11 am Post subject: Re: [Question résolue] size t, bug dans VC++2005 ? |
|
|
Dominique Vaufreydaz wrote:
| Quote: | Mais comme VC++2005 n'émet strictement aucun message il devrait
rejeter ce code, donc il est buggué. C'est en tout cas comme ça que
je lit le standard. Ais je tort Gaby ?
Non, il ne supporte pas toute la norme... D'ailleurs est-ce qu'il y a
un compilo qui respecte toute la norme ? A ma connaissance non.
|
Comeau et Intel, modulo erreurs.
| Quote: | Pour le compilo de Visual C++, microsoft affirme respecter 98%
(de memoire) de la norme.
|
Mesuré en quelle unité ? Je sais qu'il ne supporte pas
export ; où en est-il avec des templates à paramètre de
template ou la recherche des noms à deux phases ?
Un petit essai rapide :
#include <iostream>
#include <ostream>
typedef int X ;
template < typename T >
struct B
{
typedef T X ;
} ;
template< typename T >
struct D : B< T >
{
X x ;
} ;
int
main()
{
D< double > d ;
d.x = 3.14159 ;
std::cout << d.x << std::endl ;
return 0 ;
}
Avec le VC++ du Visual Studios 2005, ça affiche 3.14159, alors
que la norme exige 3. C'est quand même une chose assez
fondamentale. Je ne sais pas l'unité de mesure, mais a priori,
j'ai du mal déjà à accepter 98% sans export. Et sans la
recherche à deux phases... 80% ? Voire moins.
| Quote: | Notons aussi que le message peut etre present peut-etre si le niveau
de warning est augmente ?
|
Selon la norme, une implémentation doit documenter les
messages ; il me semble normal (et implicitement exigé) qu'elle
documente comment il faut invoquer le compilateur pour qu'il
soit plus ou moins conforme. (Avec VC++, par exemple, il faut au
moins « cl /GR /EHs /vmg ». À cet égard, j'aime bien
l'approche de g++, « g++ -std=c++98 ». Mais même alors, je
crois que d'autres options pourrait défaire une partie des
effets, et éloigner le compilateur de la norme.)
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Dominique Vaufreydaz Guest
|
Posted: Tue Aug 22, 2006 9:11 am Post subject: Re: [Question résolue] size_t, bug dans VC++2005 ? |
|
|
Bonjour,
| Quote: | Non, il ne supporte pas toute la norme... D'ailleurs est-ce
qu'il y a un compilo qui respecte toute la norme ? A ma
connaissance non.
Comeau et Intel, modulo erreurs.
|
Faut vraiment que je me paye le compilo Intel (qui s'utilise avec l'IDE Visual...).
| Quote: | Mesuré en quelle unité ? Je sais qu'il ne supporte pas
|
Aucune idée. C'est juste plus que la precedente version ;-P
J'ai bien dit qu'ils annoncent !
| Quote: | export ; où en est-il avec des templates à paramètre de
template ou la recherche des noms à deux phases ?
Avec le VC++ du Visual Studios 2005, ça affiche 3.14159, alors
que la norme exige 3. C'est quand même une chose assez
fondamentale. Je ne sais pas l'unité de mesure, mais a priori,
j'ai du mal déjà à accepter 98% sans export. Et sans la
recherche à deux phases... 80% ? Voire moins.
|
Ca depends si export et la recherche a deux phases sont
chacune 1 regle sur 100 ;-P
| Quote: | Selon la norme, une implémentation doit documenter les
messages ; il me semble normal (et implicitement exigé) qu'elle
documente comment il faut invoquer le compilateur pour qu'il
soit plus ou moins conforme. (Avec VC++, par exemple, il faut au
moins « cl /GR /EHs /vmg ». À cet égard, j'aime bien
|
J'aurais dit aussi /Zc:ForScope pour la portée des variables
déclarées dans un for. Tiens, j'ai pas trouvé dans l'IDE le
moyen d'activier (hors options mise a la main), /vmg.
| Quote: | l'approche de g++, « g++ -std=c++98 ». Mais même alors, je
crois que d'autres options pourrait défaire une partie des
effets, et éloigner le compilateur de la norme.)
|
Notons que dans ce cas la, le compilo devrait dire que
les options sont incompatibles...
Doms. |
|
| Back to top |
|
 |
Alain Gaillard Guest
|
Posted: Tue Aug 22, 2006 2:24 pm Post subject: Re: [Question résolue] size t, bug dans VC++2005 ? |
|
|
Loïc Joly a écrit :
| Quote: | Oui. Mais si je fais un compilateur où comme j'indique que mon message
sera constitué d'une chaîne vide en cas d'erreur, et d'une chaîne vide
en cas de succès, je pense que j'ai formellement rempli les contraintes
du standard.
|
Je ne pense pas quand même.
Supposons qu'en cas de succès un compilo ne sorte rien, quand le
standard dit "a conforming implementation shall issue at least one
diagnostic message," je ne pense pas qu'il faille comprendre une chaîne
vide. Le message est à priori pour l'utilisateur humain et une chaîne
vide n'est pas exploitable pour l'humain qui ne peut même pas
différencier erreur et succès.
Tel que je comprends le standard, l'implémentation est libre du contenu
du message, mais encore faut-il qu'il y ait un contenu.
--
Alain |
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Tue Aug 22, 2006 6:34 pm Post subject: Re: [Question résolue] size_t, bug dans VC++2005 ? |
|
|
Alain Gaillard <alain_gaillard28 (AT) hotmail (DOT) fr> writes:
| Loïc Joly a écrit :
|
| > Oui. Mais si je fais un compilateur où comme j'indique que mon
| > message sera constitué d'une chaîne vide en cas d'erreur, et d'une
| > chaîne vide en cas de succès, je pense que j'ai formellement rempli
| > les contraintes du standard.
|
| Je ne pense pas quand même.
| Supposons qu'en cas de succès un compilo ne sorte rien, quand le
| standard dit "a conforming implementation shall issue at least one
| diagnostic message," je ne pense pas qu'il faille comprendre une
| chaîne vide. Le message est à priori pour l'utilisateur humain et une
| chaîne vide n'est pas exploitable pour l'humain qui ne peut même pas
| différencier erreur et succès.
La norme n'interdit pas à un compilo d'émettre un diagnostic même
lorsque le programme est valide et le compilo l'a accepté.
-- Gaby |
|
| 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
|
|