GCC: warning type-punned pointer

Gast #3842351
Lesenswert?
• ▲
▼
Wie muss die unten stehende C-Zeile *1 geschrieben werden, damit die 
folgende Warnung nicht mehr Auftritt:

stack.c:73:5: warning: dereferencing type-punned pointer will break 
strict-aliasing rules [-Wstrict-aliasing]

1
 *1
2

3
(*((unsigned long*)&myip[0])) = get_eeprom_value(IP_EEPROM_STORE,MYIP);


'myip' und 'get_eeprom_value' sind wie folgt festgelegt 
(Webserver-Quelltext von U. Radig):
1
unsigned char myip[4];


1
//----------------------------------------------------------------------------
2
//
3
unsigned long get_eeprom_value (unsigned int eeprom_adresse,unsigned long default_value)
4
{
5
  unsigned char value[4];
6
  
7
  for (unsigned char count = 0; count<4;count++)
8
  {
9
    eeprom_busy_wait ();  
10
    value[count] = eeprom_read_byte((unsigned char *)(eeprom_adresse + count));
11
  }
12

13
  //Ist der EEPROM Inhalt leer (0xFF) oder Null (0x00) ?
14
  if (((*((unsigned long*)&value[0])) == 0xFFFFFFFF) || ((*((unsigned long*)&value[0])) == 0x00000000))
15
  {
16
    return(default_value);
17
  }
18
  return((*((unsigned long*)&value[0])));
19
}
Gast #3842364
Lesenswert?
• ▲
▼
Tja, du könntest entweder mit -WNostrict-aliasing compilieren, dann ist 
die Warnung weg ;), oder du könntest nachlesen, was die Warnung dir 
eigentlich sagen möchte, und dann da mal gründlich drüber nachdenken.

Oliver
#3842372
Lesenswert?
• ▲
▼
Probier mal
1
unsigned long get_eeprom_value (unsigned int eeprom_adresse, unsigned long default_value)
2
{
3
  unsigned long value;
4
  
5
  eeprom_read_block( &value, (unsigned char *)eeprom_adresse, sizeof( value ) );
6

7
  if ( value == 0xFFFFFFFF) || value == 0x00000000 )
8
    return default_value;
9

10
  return value;
11
}


Edit:
wobei mir der Cast nach unsigned char * auch noch nicht gefällt. Da 
frage ich mich, warum eeprom_adresse nicht gleich ein derartige Pointer 
in der Argumentliste ist.
Gast #3842583
Lesenswert?
• ▲
▼
Ich hab mir einfach eine Funktion geschrieben die den Kram
umrechnet und dann alle Stellen mit den Warnings ersetzt.
1
//Converts uint8_t array IP to uint32_t
2
uint32_t ToIP(uint8_t *val)
3
{
4
  return ( (uint32_t)val[0] + ((uint32_t)val[1] << 8) + ((uint32_t)val[2] << 16) + ((uint32_t)val[3] << 24) );
5
}

Danach sieht der Code auch schön leserlich aus. Beispiel:

  if( ip->IP_Destaddr == ToIP(myip) )  // if my IP address

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.