Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment controler la taille d'une strcuture a la compilation

16 réponses
Avatar
FTSoJ
Je souhaite vérifier a la compilation que deux structures ont la même
taille. En cas de différence je souhaite générer une erreur.

Exemple :
Dans un fichier A.c une type T1_user
typedef struct {
int dummy;
int age;
char lastname [128];
char firstname[128];
} T1_user;

Dans un fichier B.c une type T2_Id

typedef struct {
int id;
int age;
char dummy[256]
} T2_id;

Je veux contrôler durant la compilation (et non a l'execution) que
sizeof(T2_id) est equivalent a sizeof(T1_user).


#if sizeof(T2_id) != sizeof(T1_user)
#error "Size of T1_user differ from T2_id, compile abort!"
#endif

Cette solution, ne fonctionne pas sous codewarrior ni GCC.

Comment faire ?

L'exemple est sommaire, en réalité il y a N strcutures (T1 .. Tn)
complexes qui correspondent à de la communication intertache. La
vérification de l'exactitude des sizeof me protege du buffer overflow.

D'avance merci,

- François -

6 réponses

1 2
Avatar
Pierre Maurette
Gabriel Dos Reis wrote on 21/05/05 :
Et en faisant :

if( 0)
{
char SameSizeNeeded[2 * (sizeof(T1_user)==sizeof(T2_id)) - 1];
}

Là par contre ça devrait devenir imparable...


C'est-à-dire ?


Une taille de (sizeof)-1 est une sorte d'infini... Ca ne devrait jamais
compiler...
Avec un peu de chance, (sizeof)-1 ça fera SIZE_MAX, non ? (uns sorte

d'infini, effectivement).
(pas taper, pas commenter le "un peu de chance" :') )

--
Pour répondre directement: enlever une lettre sur deux
wwaannaaddoooo -> wanadoo

Pierre



Avatar
Emmanuel Delahaye
Pierre Maurette wrote on 21/05/05 :
Une taille de (sizeof)-1 est une sorte d'infini... Ca ne devrait jamais
compiler...



Evidemment, j'ai écrit sizeof et je pensais à size_t, mais tout le
monde aura corrigé de lui même...

Avec un peu de chance, (sizeof)-1 ça fera SIZE_MAX, non ? (uns sorte
d'infini, effectivement).
(pas taper, pas commenter le "un peu de chance" :') )


En fait, une objet pourrait très bien faire SIZE_MAX... donc, pas sûr
que la méthode fonctionne...

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

.sig under repair


Avatar
Pierre Maurette
Pierre Maurette wrote on 21/05/05 :
Une taille de (sizeof)-1 est une sorte d'infini... Ca ne devrait jamais
compiler...



Evidemment, j'ai écrit sizeof et je pensais à size_t, mais tout le monde aura
corrigé de lui même...
C'est marrant, j'avais lu size_t et j'ai écrit sizeof ...


Avec un peu de chance, (sizeof)-1 ça fera SIZE_MAX, non ? (uns sorte
d'infini, effectivement).
(pas taper, pas commenter le "un peu de chance" :') )


En fait, une objet pourrait très bien faire SIZE_MAX... donc, pas sûr que la
méthode fonctionne...
Sous MS VC, size_t est dans stddef.h, mais (sauf erreur) SIZE_MAX

n'existe pas. Je le définis (size_t)-1 ou (size_t)~0.

--
Pour répondre directement: enlever une lettre sur deux
wwaannaaddoooo -> wanadoo

Pierre



Avatar
Emmanuel Delahaye
Pierre Maurette wrote on 21/05/05 :
Sous MS VC, size_t est dans stddef.h, mais (sauf erreur) SIZE_MAX n'existe
pas. Je le définis (size_t)-1 ou (size_t)~0.


Je crois que ça existe en C99...

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

.sig under repair

Avatar
Gabriel Dos Reis
"Emmanuel Delahaye" writes:

| Pierre Maurette wrote on 21/05/05 :
| >> Une taille de (sizeof)-1 est une sorte d'infini... Ca ne devrait
| >> jamais compiler...
|
| Evidemment, j'ai écrit sizeof et je pensais à size_t, mais tout le
| monde aura corrigé de lui même...
|
| > Avec un peu de chance, (sizeof)-1 ça fera SIZE_MAX, non ? (uns sorte
| > d'infini, effectivement).
| > (pas taper, pas commenter le "un peu de chance" :') )
|
| En fait, une objet pourrait très bien faire SIZE_MAX... donc, pas sûr
| que la méthode fonctionne...

J'ai relu ce qu'il a écrit, cela devrait fonctionner -- il y avait
trop de parenthèses et je n'ai pas fait attention à la position de -1 :-(

Il n'y a pas de converion implicit vers size_t.

-- Gaby
Avatar
Patrick 'Zener' Brunet
Bonjour.

"Emmanuel Delahaye" writes:

Pierre Maurette wrote on 21/05/05 :
Une taille de (sizeof)-1 est une sorte d'infini... Ca ne devrait
jamais compiler...



[...]
En fait, une objet pourrait très bien faire SIZE_MAX... donc, pas sûr
que la méthode fonctionne...


J'ai relu ce qu'il a écrit, cela devrait fonctionner -- il y avait
trop de parenthèses et je n'ai pas fait attention à la position de -1
:-(

Il n'y a pas de converion implicit vers size_t.



Oui, dans ma thête à x je l'avais vu en signé, donc ça faisait le
strictement inacceptable :

char SameSizeNeeded[-1];

Alors évidemment si le compilo veut le voir non signé, qu'à cela ne tienne :
oublions le char et donnons-lui un type plus gros, combiné avec une taille
d'entier inacceptable :

if( 0)
{
long SameSizeNeeded[2L * (sizeof(T1_user)==sizeof(T2_id)) - 1L];
}

Vous m'avez compris, alors le compilo va bien finir par comprendre aussi :-D

Le nom de la variable est choisi pour participer au mieux à la sémantique du
message d'erreur.

Quant aux parenthèses, je les mets systématiquement lorsque fais des
combinaisons d'opérateurs qui sont susceptibles de laisser un doute même
fugitif sur leur priorité, et même au besoin pour regrouper des termes d'un
point de vue purement sémantique.

Au fait : Est-ce qu'il y a une garantie de pouvoir estimer la quantité de
mémoire théoriquement allouable (selon la conception du compilateur) par
rapport à la capacité maximale d'un type (l'entier standard non signé par
exemple) ? Ce problème intervient ici plus ou moins à l'estime...

En effet, même s'il est raisonnable de le penser, le compilo sait-il qu'il
ne doit même pas en rêve dimensionner un objet automatique à (sizeof( long)
* MAX_ULONG) octets ? Sinon l'erreur sera indirecte : techniquement
insatisfaisable au link mais accepté à la compilation...


Hope It Could Be Useful.

Cordialement,

--
/***************************************
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
***************************************/




1 2