Forum: Compiler & IDEs strict-aliasing rules


von Owen S. (senmeis)


Lesenswert?

Hi,

ich habe ein kleines Programm mit dem AVRGCC kompiliert.
Warnung: dereferencing type-punned pointer will break strict-aliasing 
rules.
Die Ursache ist "HIGHUINT16(var32)".
Wie kann das Makro "HIGHUINT16(value)" geändert werden damit die Warnung 
weg ist (und trotzdem wird das Makro weiter benutzt wie bisher)?
1
#define  UINT8  unsigned char
2
#define  UINT16  unsigned short
3
#define  UINT32  unsigned long
4
#define  HIGHUINT8(value)  *( (UINT8 *) &(value)) 
5
#define  HIGHUINT16(value)  *( (UINT16 *) &(value)) 
6
7
int main()
8
{
9
  UINT32 var32 = 0x11223344;
10
  UINT16 var16;
11
  UINT8 var8;
12
  var16 = HIGHUINT16(var32);
13
  var8 = HIGHUINT8(var16);
14
  return 0;
15
}
Danke im Voraus
Senmeis

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Man könnte mal das lesen:
   Beitrag "dereferencing type-punned pointer - was ist das?"
oder das:
   Beitrag "strict-aliasing rules"

Für dein Schnippel könnt es so aussehen. Das Zeiger-Gecaste kannst 
sparen in dem Beispiel:
1
#include <stdint.h>
2
3
#define  HIGHUINT8(value)  ((uint8_t) value) 
4
#define  HIGHUINT16(value) ((uint16_t) value) 
5
6
int main()
7
{
8
  uint32_t var32 = 0x11223344;
9
  uint16_t var16;
10
  uint8_t  var8;
11
  var16 = HIGHUINT16(var32);
12
  var8 = HIGHUINT8(var16);
13
  return 0;
14
}

Johann

von yalu (Gast)


Lesenswert?

Übrigens: Die Namen der Makros sind verwirrend, da sie nicht die
höchst-, sondern die niederwertigsten 8 bzw. 16 Bits des Arguments
liefern (Integers werden beim AVR im Little-Endian-Format abgelegt).
Oder hast du die Endianess für irgendwelche Netzwerkgeschichten
absichtlich andersherum definiert?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.