Sie können pahole
verwenden, um Informationen zu Löchern in Strukturen auszugeben und optional zu versuchen, sie zu packen.
Vielleicht möchten Sie "Poke-a-hole and friends" und die phole Ankündigung für weitere Informationen
Ich kenne kein automatisches Werkzeug, aber dies könnte ein hilfreiches Beispiel sein:
%Vor%* Hinweis: Sie müssen dies für jeweils zwei Mitglieder in Ihrem stecken.
Sie könnten diese Frage untersuchen, indem Sie einen Prüfcode für ein bestimmtes struct
schreiben, indem Sie sizeof
und &
; Wenn sizeof
das nth Mitglied nicht gleich der Adresse des nächsten Mitglieds minus der Adresse dieses Mitglieds ist, gibt es ein Loch.
Eine Möglichkeit, solche Lücken zu finden, ohne den Quellcode zu analysieren und ohne Prüfungen hinzuzufügen (mit offsetof () und Ähnlichem) wäre, die Symbol- / Debug-Informationen aus den Objekt / ausführbaren / Symboldateien mit einem Werkzeug und zu extrahieren Schau dir die definierten Strukturen und Mitglieder in ihnen an, ihre Versätze und Größen und sieh, ob sich alles summiert. Gewerkschaften werden jedoch die Dinge komplizierter machen.
Sie können solche "Löcher" über das Makro offsetof
erkennen:
Wenn mehr als 1
gedruckt wird, hat b
offensichtlich Ausrichtungsanforderungen, und der Compiler erzeugt dazwischen eine Lücke.
Offensichtlich geschieht dies zur Laufzeit, nicht zur Kompilierzeit, aber Sie können ein Skript schreiben, das eine ähnliche Quelldatei erzeugt, kompiliert und vor dem Rest Ihres Projekts ausführt, und dann basierend auf der Ausgabe weitere Entscheidungen treffen wie man ein Projekt erstellt.
Ich denke nicht, dass ein Compiler eine Möglichkeit bietet, Sie darüber zu informieren.
Tags und Links c struct memory-alignment