Suchen Sie nach Lücken in C-Strukturen aufgrund der Ausrichtung

9

Gibt es eine Möglichkeit in gcc oder clang (oder irgendeinem anderen Compiler) Informationen darüber auszuspucken, ob eine Struktur Löcher (Speicherausrichtung) enthält?

Danke.

ps: Wenn es eine andere Möglichkeit gibt, es zu tun, bitte informieren Sie mich.

    
John 06.10.2011, 12:17
quelle

7 Antworten

4

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

    
Hasturkun 06.10.2011, 13:17
quelle
1

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.

    
Roee Gavirel 06.10.2011 13:02
quelle
1

Gimpels FlexeLint / PClint kann dies tun.

%Vor%

Es wird berichten

%Vor%     
Jens 18.06.2015 14:37
quelle
0

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.

    
Ernest Friedman-Hill 06.10.2011 12:20
quelle
0

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.

    
Alexey Frunze 06.10.2011 12:26
quelle
0

Sie können solche "Löcher" über das Makro offsetof erkennen:

%Vor%

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.

    
Blagovest Buyukliev 06.10.2011 12:22
quelle
0

Sie benötigen einen Parser, der c / c ++ - Strukturen versteht und notwendige Include-Dateien enthält.

Wie von @ roee-gavirel geantwortet, denke ich, dass es einfacher ist, ein Testprogramm zu erstellen, um die Offsets auszudrucken

%Vor%     
yoonghm 10.03.2018 10:21
quelle

Tags und Links