OVH Cloud OVH Cloud

TC++PL3 bugs

6 réponses
Avatar
Laurent Deniau
J'ai cherche des errata sur la classe Pool (19.4.2) et je n'ai rien
trouve sur la faute de typo (s/[size]/[csize]/) et le bug d'alignement
(char mem[csize] sans padding) qui m'ont sautes aux yeux. Est-ce que
j'ai rate qqchose sur ses pages d'errata?

a+, ld.

6 réponses

Avatar
Gabriel Dos Reis
Laurent Deniau writes:

| J'ai cherche des errata sur la classe Pool (19.4.2) et je n'ai rien
| trouve sur la faute de typo (s/[size]/[csize]/) et le bug d'alignement
| (char mem[csize] sans padding) qui m'ont sautes aux yeux. Est-ce que
| j'ai rate qqchose sur ses pages d'errata?

Quel tirage utilises-tu ?

Où est-ce que tu vois csize?

En ce qui concerne l'alignment, les choses nesont pas très claires
(même si en pratique cela fait exactement ce qu'il faut).

Pool::Chunk est un POD dont le premier member est bien mem.
Donc, si tu obtiens de la mémoire genre

void* p = operator new(sizeof Pool::Chunk);

tu sais que p est bien aligné pour n'importe quel type d'objet.
Si tu place un Pool::Chunk là bas, cela revient à placer aussi
Pool::Chunk::mem là bas -- c'est mon interprétation du fait qu'un
struct-POD a la même adresse que son premier membre. Donc il aura
un alignement qui satisfait n'importe quel type d'objet.

Maintenant, je suppose que

Chunk* n = new Chunk;

est équivalent à

void* p = operator new(sizeof Chunk);
Chunk* n = static_cast<Chunk*>(p);

puisque Chunk est un POD.

-- Gaby
Avatar
Laurent Deniau
Gabriel Dos Reis wrote:
Laurent Deniau writes:

| J'ai cherche des errata sur la classe Pool (19.4.2) et je n'ai rien
| trouve sur la faute de typo (s/[size]/[csize]/) et le bug d'alignement
| (char mem[csize] sans padding) qui m'ont sautes aux yeux. Est-ce que
| j'ai rate qqchose sur ses pages d'errata?

Quel tirage utilises-tu ?


3rd printing 1997, mais j'ai la meme erreur sur mon ES que je n'ai pas
sous la main donc je ne connais pas sont tirage.

Où est-ce que tu vois csize?


dans le enum du Chunk.

En ce qui concerne l'alignment, les choses nesont pas très claires
(même si en pratique cela fait exactement ce qu'il faut).

Pool::Chunk est un POD dont le premier member est bien mem.


Sur ma version, c'est Chunk *next qui est le premier membre, sinon je
n'aurais pas vu de probleme. Le 8*1024-16 aussi n'est pas clair pour
moi. Ca devrait etre 8*1024-16-offsetof(Chunk, mem) s'il veut etre sur
de tenir sur une page (en considerant que l'allocateur prend maximum 16
char pour ses infos, mais je suppose que c'est ce qu'il sous entend).

Donc, si tu obtiens de la mémoire genre

void* p = operator new(sizeof Pool::Chunk);

tu sais que p est bien aligné pour n'importe quel type d'objet.
Si tu place un Pool::Chunk là bas, cela revient à placer aussi
Pool::Chunk::mem là bas -- c'est mon interprétation du fait qu'un
struct-POD a la même adresse que son premier membre. Donc il aura
un alignement qui satisfait n'importe quel type d'objet.


Sauf que c'est pas mem le premier membre de Chunk. Pour aligner le tout
il faudrait que mem[] soit dans une union de containte d'alignement.

a+, ld.

Avatar
Michel Michaud
Dans le message csreha$j4u$,
J'ai cherche des errata sur la classe Pool (19.4.2) et je n'ai rien
trouve sur la faute de typo (s/[size]/[csize]/)


Je ne vois pas le problème dans le code... Je vois un « size » et une
utilisation de « size » tout à fait normale...

et le bug d'alignement (char mem[csize] sans padding) qui m'ont
sautes aux yeux. Est-ce que j'ai rate qqchose sur ses pages d'errata?


Est-ce vraiment un problème dans un exemple de ce genre ?

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Michel Michaud
Dans le message csrhf0$pap$,
Gabriel Dos Reis wrote:
Laurent Deniau writes:

J'ai cherche des errata sur la classe Pool (19.4.2) et je n'ai
rien trouve sur la faute de typo (s/[size]/[csize]/) et le bug
d'alignement (char mem[csize] sans padding) qui m'ont sautes aux
yeux. Est-ce que j'ai rate qqchose sur ses pages d'errata?


Quel tirage utilises-tu ?


3rd printing 1997,


Plutôt ancien :-)

mais j'ai la meme erreur sur mon ES que je n'ai
pas sous la main donc je ne connais pas sont tirage.


Mon édition spéciale n'a pas l'erreur...

Les erratas de BS sont classés par édition, ton erreur est
indiquée ici :

http://www.research.att.com/~bs/3rd_printing4.html

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



Avatar
Gabriel Dos Reis
Laurent Deniau writes:

| Gabriel Dos Reis wrote:
| > Laurent Deniau writes:
| > | J'ai cherche des errata sur la classe Pool (19.4.2) et je n'ai rien
| > | trouve sur la faute de typo (s/[size]/[csize]/) et le bug d'alignement
| > | (char mem[csize] sans padding) qui m'ont sautes aux yeux. Est-ce que
| > | j'ai rate qqchose sur ses pages d'errata?
| > Quel tirage utilises-tu ?
|
| 3rd printing 1997, mais j'ai la meme erreur sur mon ES que je n'ai pas
| sous la main donc je ne connais pas sont tirage.

hmm, j'ai la SE, first printing sous la main.

|
| > Où est-ce que tu vois csize?
|
| dans le enum du Chunk.

dans le tirage que j'ai, c'est size.

| > En ce qui concerne l'alignment, les choses nesont pas très claires
| > (même si en pratique cela fait exactement ce qu'il faut).
| > Pool::Chunk est un POD dont le premier member est bien mem.
|
| Sur ma version, c'est Chunk *next qui est le premier membre, sinon je

Dans ma version c'est mem, donc je suppose que cela a été corrigé.

-- Gaby
Avatar
Laurent Deniau
Michel Michaud wrote:
Dans le message csrhf0$pap$,

Gabriel Dos Reis wrote:

Laurent Deniau writes:

J'ai cherche des errata sur la classe Pool (19.4.2) et je n'ai
rien trouve sur la faute de typo (s/[size]/[csize]/) et le bug
d'alignement (char mem[csize] sans padding) qui m'ont sautes aux
yeux. Est-ce que j'ai rate qqchose sur ses pages d'errata?



Quel tirage utilises-tu ?



3rd printing 1997,



Plutôt ancien :-)


C'est pour ca que je me suis offert la SE en 2000 ;-)

mais j'ai la meme erreur sur mon ES que je n'ai
pas sous la main donc je ne connais pas sont tirage.



Mon édition spéciale n'a pas l'erreur...


Maintenant que je l'ai sous la main, je peux confirmer que la mienne non
plus. Effectivement c'est lie a ma vieille edition.

J'avais csize au lieu de size dans le enum et next etait avant mem. Je
pense que dans les deux cas c'est une faute de typo de mon edition.

Les erratas de BS sont classés par édition, ton erreur est
indiquée ici :

http://www.research.att.com/~bs/3rd_printing4.html


Voila ce que j'avais rate. Mais il ne parle pas de l'alignement.

a+, ld.