Vérification à la compilation

Le
Guillaume GOURDIN
Bonjour à tous,

je voudrais m'assurer au moment de la compilation que la taille d'une
structure est bien celle que j'attends afin de ne pas être ennuyé pas
des histoire de padding.

Est-il possible de faire des choses du style :

#if (sizeof(my_struct) != 4*sizeof(uint32_t))
#error "Invalid structure padding."
#endif

Merci pour votre aide.

- Guillaume -
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Kojak
Le #17535691
Le Wed, 15 Oct 2008 11:45:20 +0200,
Guillaume GOURDIN
je voudrais m'assurer au moment de la compilation que la taille d'une
structure est bien celle que j'attends afin de ne pas être ennuyà © pas
des histoire de padding.



Salut,

Je ne sais pas si c'est la réponse que tu attends, mais avec gcc,
l'option "-Wpadded" t'avertit si du padding est inclus dans ta
structure.

Cordialement,

--
Jacques.
Marc Boyer
Le #17536131
On 2008-10-15, Guillaume GOURDIN
Bonjour à tous,

je voudrais m'assurer au moment de la compilation que la taille d'une
structure est bien celle que j'attends afin de ne pas être ennuyé pas
des histoire de padding.

Est-il possible de faire des choses du style :

#if (sizeof(my_struct) != 4*sizeof(uint32_t))
#error "Invalid structure padding."
#endif



On peut.

static char verifie_que_mystruct_a_pas_padding[ sizeof(my_struct) == 4*sizeof(uint32_t) ];

On a pas le droit de définir un tableau avec une taille de 0, et la comparaison
retourne 0 ou 1...
Le static est juste là pour inciter le compilo à virer la variable vu
que personne ne va l'utiliser. Sinon, on a perdu quelques octets...

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)
viza
Le #17536311
On Wed, 15 Oct 2008 11:45:20 +0200, Guillaume GOURDIN wrote:

je voudrais m'assurer au moment de la compilation que la taille d'une
structure est bien celle que j'attends afin de ne pas être ennuyé pas
des histoire de padding.

Est-il possible de faire des choses du style :

#if (sizeof(my_struct) != 4*sizeof(uint32_t))
#error "Invalid structure padding."
#endif



sizeof n'est pas disponable au preprecesseur.
ld
Le #17536971
On 15 oct, 14:25, Marc Boyer
On 2008-10-15, Guillaume GOURDIN
> Bonjour à tous,

> je voudrais m'assurer au moment de la compilation que la taille d'une
> structure est bien celle que j'attends afin de ne pas être ennuyé p as
> des histoire de padding.

> Est-il possible de faire des choses du style :

> #if (sizeof(my_struct) != 4*sizeof(uint32_t))
> #error "Invalid structure padding."
> #endif

  On peut.

static char verifie_que_mystruct_a_pas_padding[ sizeof(my_struct) == 4*sizeof(uint32_t) ];

  On a pas le droit de définir un  tableau avec une taille de 0, et la comparaison
retourne 0 ou 1...
  Le static est juste là pour inciter le compilo à virer la variabl e vu
que personne ne va l'utiliser. Sinon, on a perdu quelques octets...



de meme que l'on ne peut pas representer 1/0 sur un entier.

enum { mystruct_a_du_padding = 1/(sizeof(my_struct) ==
4*sizeof(uint32_t)) };

n'utilise pas de place. C'est la base de mon static assert.

a+, ld.
rixed
Le #17542941
De même que l'on ne peut pas avoir deux fois zéro dans un switch :

#define COMPILE_ASSERT(x) switch(x) {
case 0: break;
case (x): break;
}
Antoine Leca
Le #17559061
En news:,
va escriure:
De même que l'on ne peut pas avoir deux fois zéro dans un switch :

#define COMPILE_ASSERT(x) switch(x) {
case 0: break;
case (x): break; }



C'est habile mais je ne ferais pas confiance aux compilateurs pour refuser
de compiler une telle construction (avec x==0), je suis certain qu'il ne
doit pas être difficile de rencontrer un compilo qui va certes donner
l'avertissement requis par la norme, mais va continuer quand même la
compilation, pensant qu'il s'agit « seulement » d'une étourderie de
programmation.

Les break sont inutiles (sauf peut-être pour éviter de recevoir des
tombereaux d'avertissements de la part de compilateurs pointilleux).


Antoine
espie
Le #17559741
In article Antoine Leca
En news:,
va escriure:
De même que l'on ne peut pas avoir deux fois zéro dans un switch :

#define COMPILE_ASSERT(x) switch(x) {
case 0: break;
case (x): break; }



C'est habile mais je ne ferais pas confiance aux compilateurs pour refuser
de compiler une telle construction (avec x==0), je suis certain qu'il ne
doit pas être difficile de rencontrer un compilo qui va certes donner
l'avertissement requis par la norme, mais va continuer quand même la
compilation, pensant qu'il s'agit « seulement » d'une étourderie de
programmation.



Non, ca n'est pas un avertissement, c'est une erreur. Diagnostic requis
de toute implementation conforme.
Antoine Leca
Le #17589071
En news:gdacol$1bp1$, Marc Espie va escriure:
In article Antoine Leca
En news:,
va escriure:
De même que l'on ne peut pas avoir deux fois zéro dans un switch :

#define COMPILE_ASSERT(x) switch(x) {
case 0: break;
case (x): break; }



C'est habile mais je ne ferais pas confiance aux compilateurs pour
refuser de compiler une telle construction (avec x==0), je suis
certain qu'il ne doit pas être difficile de rencontrer un compilo
qui va certes donner l'avertissement requis par la norme, mais va
continuer quand même la compilation, pensant qu'il s'agit
« seulement » d'une étourderie de programmation.



Non, ca n'est pas un avertissement, c'est une erreur. Diagnostic
requis de toute implementation conforme.



Désolé mais non : diagnostic requis signifie seulement que le compilateur
_doit_ émettre un message, cela ne signifie pas qu'il doit refuser de créer
le fichier objet (ce qui constitue la seule différence réelle entre un
avertissement et une erreur non fatale sur la plupart des compilateurs).
Donc émettre un avertissement est un diagnostic valable au sens de la norme.


Dans le genre, tu as en particulier les options '-pedantic', dont l'unique
objet est d'émettre les diagnostics requis par la norme, alors même que les
concepteurs du compilateur considèrent (à tort ou à raison, c'est un autre
débat) que le dit diagnostic est inutile : donc ils marquent le diagnostic
du sceau supposé infamant de la pédanterie, mais vont rarement jusqu'à
refuser de compiler le dit programme.

Ou alors il faudrait plutôt utiliser '-pedantic-error' ou '-Wx' mais ces
derniers ne sont PAS requis pour être conformes à la norme.


Antoine
Publicité
Poster une réponse
Anonyme