10
votes

Trouver des trous dans C Structs due à l'alignement

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?

Merci.

PS: S'il y a une autre façon de le faire, veuillez m'informer.


1 commentaires

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.


7 Réponses :


0
votes

Vous pouvez explorer cette question en écrivant un code de sonde pour un struct en utilisant taille de et & ; Si Tailleof Le membre NTH n'est pas égal à l'adresse du membre suivant moins l'adresse de ce membre, il y a un trou.


0 commentaires

0
votes

Vous pouvez détecter de tels "trous" via le offsetof macro: xxx

si cela imprime plus que 1 , , b a évidemment des exigences d'alignement et le compilateur produit un écart entre les deux.

É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.

Je ne pense pas que le compilateur fournisse une installation pour vous informer de cela.


3 commentaires

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.



0
votes

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.


3 commentaires

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 et al do



1
votes

Je ne connais aucun outil automatique, mais cela pourrait être utile exemple: xxx

* Remarque: vous devrez le faire pour chaque deux membres de votre collage.


0 commentaires

5
votes

Vous pouvez utiliser Pahole pour produire des informations sur les trous dans les structures et éventuellement tenter de les emballer.

Vous voudrez peut-être lire "Poke-a-trou et amis" et l'annonce Pahole pour plus d'informations


1 commentaires

Merci. Je suppose que c'est ce que je cherchais.



1
votes

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


0 commentaires

0
votes

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 xxx


0 commentaires