Y a-t-il une manière dans GCC ou SLIG (ou tout autre compilateur) de cracher des informations sur la question de savoir si une structure a des trous (alignement de la mémoire - sage) dedans? p>
Merci. p>
PS: S'il y a une autre façon de le faire, veuillez m'informer. p>
7 Réponses :
Vous pouvez explorer cette question en écrivant un code de sonde pour un struct code> en utilisant
taille de code> et
& code>; Si
Tailleof code> Le membre NTH em> n'est pas égal à l'adresse du membre suivant moins l'adresse de ce membre, il y a un trou. P>
Vous pouvez détecter de tels "trous" via le si cela imprime plus que Évidemment, cela se produit au moment de l'exécution, pas au moment de la compilation, mais vous pouvez écrire un script qui produit un fichier source similaire, compile et le gère avant le reste de votre projet, puis sur la base de la sortie que vous effectuez d'autres décisions sur la manière de construire votre projet. P> Je ne pense pas que le compilateur fournisse une installation pour vous informer de cela. p> p> offsetof code> macro:
1 code>,
,
b code> a évidemment des exigences d'alignement et le compilateur produit un écart entre les deux. P>
Y a-t-il un moyen d'automatiser cela?
L'enquête sur les structures peut ne pas suffire, il existe des options d'aligner, que ce soit dans le code ou même dans les CFLAG. Sur combien de lignes de code parlez-vous? Est-il possible que les structures soient utilisées pour stocker des données dans des fichiers?
Ma question est principalement de nature académique, mais j'aimerais tester quelques millions de millions. Les conductions sont principalement des objets CAO / CAE.
Un moyen de trouver de tels trous sans analyser le code source et sans ajouter de vérification (en utilisant offsetof () et similaire) serait d'extraire les informations de symbole / débogage des fichiers objet / exécutable / symbole avec un outil et Regardez les structures et les membres définis, leurs compensations et leurs tailles et voyez si tout s'additionne. Les syndicats compliqueront cependant les choses. P>
Donc, je suppose qu'il n'y a pas de commutateur compilateur :). C'est un sujet intéressant (pour moi au moins) cependant. Où puis-je commencer, si je voulais analyser des fichiers d'objet?
@John: Voir d'abord s'il y a des outils pouvant lire les informations de symbole / debug et de le jeter sur une forme lisible par l'homme. Sinon, voir quels outils, pour lesquels vous avez un code source, consommez ces données et développez votre propre en fonction de cela. Et, comme d'habitude, voir la documentation sur les formats de fichiers.
c'est ce que pahole code> et al do
Je ne connais aucun outil automatique, mais cela pourrait être utile exemple: * Remarque: vous devrez le faire pour chaque deux membres de votre collage. P > p>
Vous pouvez utiliser Pahole code>
pour produire des informations sur les trous dans les structures et éventuellement tenter de les emballer. p>
Vous voudrez peut-être lire "Poke-a-trou et amis" et l'annonce Pahole pour plus d'informations p>
Merci. Je suppose que c'est ce que je cherchais.
FLEXELINT / PCLint de Gimpel peut faire cela.
$ flexelint -w1 +e95? tst.c FlexeLint for C/C++ (Unix) Vers. 9.00L, Copyright Gimpel Software 1985-2014 --- Module: tst.c (C) _ double d; tst.c 5 Note 958: Padding of 7 byte(s) is required to align member on 8 byte boundary _ } f = { 1, 2.0, 3 }; tst.c 7 Note 959: Nominal struct size (18 bytes) is not an even multiple of the maximum member alignment (8 bytes) tst.c 7 Note 958: Padding of 6 byte(s) is required to align end of struct on 8 byte boundary
Vous avez besoin d'un analyseur qui comprend des structures C / C ++ et inclut les fichiers nécessaires.
AS remplacé par @ Roee-Gavirel, je pense que la solution la plus facile est de créer un programme de test pour imprimer les décalages p>
Il existe des techniques connues pour écrire des structures afin que vous puissiez être pratiquement sûr qu'ils ne contiennent pas de rembourrage. Si cela vous aiderait, faites-moi savoir et je vous remplirai sur les détails.