ms schrieb:
> Hallo Steffen,
>
> Steffen R. schrieb:
>> - Alignment nicht beachtet (zusätzliche Füllbytes, welche im char-Buffer
>> nicht sind)
>> - Wenn message an einer ungünstigen Adresse liegt (weil ja ein
>> char-Buffer das darf) geht bei verschiedenen Umgebungen der Zugriff auf
>> 32bit schief message->IpAddr
>
> kannst Du mir da mal ein Beispiel geben.Ich würde das gerne mal bei mir
> im Labor Testen lassen an verschieden DEV-Systemen.
Der erste Punkt ist einfach. Man nehme ein System mit Alignment 4 oder 8
(z.B. arm-gcc)
Es entsteht
1 | typedef struct {
|
2 | uint16_t Length;
|
3 | -- 2 Füllbytes --
|
4 | uint32_t IpAddr;
|
5 | uint8_t Data[250];
|
6 | } message_t;
|
Für den zweiten Fall habe ich kein Beispiel zu Hand. Das char Array
erfordert ein Alignment von 1 und kann somit z.B. auch an ungeraden
Adressen anfangen. Häufig beginnen die Linker aber an eine ihrem max.
Alignment passenden Stelle. Daher wird es in vielen Fällen nicht
crashen, solange man die Struktur genau an den Anfang des Arrays legt.
Nur für die, die nicht kennen, dass man manche Zugriffe nicht auf
beliebige Adressen durchführen darf:
Z.B. beim C166 würde ein modifiziertes Beispiel crashen:
1 | message_t *message = (message_t *) &TestPuffer[1];
|
2 | uint32_t ip = message->IpAddr
|