2010-01-06 13 views
6

Unter der Annahme, ich habe ein struct wie die folgenden:Kann das struct-Padding vom Benutzercode sicher verwendet werden?

struct Struct { 
    char Char; 
    int Int; 
}; 

und sizeof(int) größer als eins ist und der Compiler fügt Polsterung für den Char Elementvariable - ist der Compiler generierte Code erlaubt, die Werte der Füllbytes zu ändern ?

meine ich, wenn ich Zeigerarithmetik verwenden und einige Daten in die Füllbytes umgebenden Char Elementvariable schreiben und später variable.Char = Zuordnung tun, ist es möglich, dass der Code durch den Compiler erzeugt werden ebenfalls einige der Füllbytes zu überschreiben?

+1

@nobugz, ich denke, es ist eine gültige Frage. Wenn Sie eine Struktur auf 0 setzen, bevor Sie die Werte festlegen, können Sie später mit memcmp zwei Strukturen vergleichen, aber nur, wenn der Compiler die Füllbytes nicht berührt. – quinmars

+0

Nicht mit Padding, 'memset' oder' memcpy' mit Klassen und Strukturen herumspielen. Der ** sicherere ** und ** robustere ** Ansatz besteht darin, Methoden zum Lesen von und Schreiben in einen gepackten Puffer (z.B. 'unsigned char []') zu implementieren. Die Versicherung ist den extra ausführbaren Speicherplatz und die Zeit wert. –

+0

@Thomas Matthews, ich glaube, du hast mich falsch verstanden. Ich sprach über den Vergleich zweier Strukturen, siehe http://stackoverflow.com/questions/141720/how-do-you-compare-structs-for-equality-in-c/141791#141791 – quinmars

Antwort

10

Der folgende Satz ist falsch: Nein, es würde die Füllbytes nicht überschreiben. Aber es ist wahrscheinlich keine gute Methode, das zu verwenden. Wenn Sie es brauchen, fügen Sie dort Mitgliedsvariablen hinzu.

Ich recherchieren auf Kommentare basierend angibt (richtig), dass ich dumm bin:

Der C Standard ein "Anhang J" mit Abschnitt J.1 unspezifisch Verhalten. Er sagt: "Der Wert von Füllbytes beim Speichern von Werten in Strukturen oder Vereinigungen". Die Implikation besteht darin, dass der Compiler beliebige Anweisungen generieren kann, um die Daten in die Struktur schreiben zu können, was es ermöglichen kann, das Auffüllen nach einem Element zu überschreiben.

+0

Es gibt nichts, was den Compiler daran hindern könnte, das Padding zu überschreiben. –

+0

ja, warum nicht? – jalf

+0

Mea culpa.Du hast Recht. Es gibt nichts, was das verhindert. Anhang J der C-Norm listet "den Wert von Füllbytes in Strukturen" als nicht spezifiziert auf. –

4

Sie können sicher etwas dort schreiben, und memset -ing eine Instanz einer solchen Struktur tut das. Es ist jedoch nicht sicher und nie eine gute Idee, dies zu tun. An einem anderen Tag setzt ein anderer Entwickler irgendwo einen #pragma oder fügt ein Mitglied zur struct-Deklaration hinzu und Ihr Code wird auf viele seltsame und ausgefallene Arten explodieren, was ziemlich lange dauern kann, um zu debuggen.

13

Was wäre, wenn der Compiler schlau genug wäre, ein Wort zu verwenden, um das Zeichen zu speichern? Ihre sorgfältig gespeicherten Daten wären verloren. ;-)

+0

richtig, ich denke das ist die Frage. Darf der Compiler dies tun oder nicht? – quinmars

+0

Der Compiler ist offenbar erlaubt, das zu tun. Ich habe meine falsche Antwort aktualisiert, um so viel anzuzeigen, und habe diese aktualisiert. –

+0

@MarkW, oh, gut zu wissen. Vielen Dank! – quinmars

1

Der einzige Grund, dies zu tun, wäre so etwas wie ein Plugin, das eine Host-Anwendung dazu bringt, zusätzliche Daten zu speichern.

Tun Sie es aber nicht, denn irgendwann in der Zukunft wird brechen, und es wird ein schwerer Kopfschmerz für alle Beteiligten sein.

Verwandte Themen