Hallo,
ich will gerade den TCP/IP Stack von Ulrich Radig kompilieren. Dabei
erhalte ich mehrere Warnungen und weiss nicht so recht was das Problem
ist.
Für Zeile:
Ich verstehe das so:
Die Funktion "get_eeprom_value" holt die IP aus dem EEprom wenn dieser
nicht leer ist. Ansonsten wird das Default Value zurückgegeben. Der
Rückgabewert ist vom Typ unsigned long. Diese 4 Bytes sollen an die
Adresse von myip[0] geschrieben werden. Es erfolgt ein Cast des unsigned
char Zeigers auf einen unsigned long Zeiger. Mit dem ersten * soll dann
der Wert dort gespeichert werden.
Aber was möchte mir der Compiler jetzt mitteilen und wie bekomme ich die
Warnung weg?
Gruß Rene
Rene Zimmermann schrieb:> Aber was möchte mir der Compiler jetzt mitteilen
Dass das wilde hin und her gecaste eines Zeigertyps ziemlicher
Pfusch ist.
> und wie bekomme ich die> Warnung weg?
Indem man die vier Oktetts sauber einzeln aufbaut und
dann an myip[] zuweist. Da sie aus dem EEPROM schon byteweise
gelesen werden, kann man natürlich einfach damit weiterarbeiten.
Man muss dann lediglich die vier Bytes einzeln gegen 0xFF vergleichen,
statt daraus fiktiv einen 32-bit-Integer zu fummeln, den man dann
der Faulheit halber gegen 0xFFFFFFFF vergleicht.
Der "unsigned long" darin hat ansonsten keinerlei Bedeutung, da
die vier gelesenen Bytes sowieso nicht zusammenhängend als eine
Zahl betrachtbar sind. Schließlich stellt sich keiner hin
und sagt "meine IP-Adresse ist die 3232236289", sondern man sagt
stattdessen "meine IP-Adresse ist die 192.168.3.1".
Das ist aber problematisch, wenn eine IP-Adresse eine 255 enthält, was
sie durchaus darf.
Einerseits, wenn diese "IP-Adresse" genutzt wird, um eine Subnet Mask zu
speichern, andererseits aber auch direkt; 192.168.255.1 ist eine völlig
legale Adresse.
Wenn es nur darum geht, das Zeug irgendwie ohne Warnungen zu übersetzen
und zum Laufen zu bekommen, geht -fno-strict-aliasing.
Das bedeutet dann, daß jeder Typ jeden anderen aliasen kann — entgegen
den Aliasing-Regeln des C-Standards.
Damit muss man dann nicht (fremde) Quellen debuggen und von Hacks
(zumindest nicht von diesem) säubern.
Rufus Τ. Firefly schrieb:> Das ist aber problematisch, wenn eine IP-Adresse eine 255 enthält, was> sie durchaus darf.
Hast natürlich recht, die Logik muss man ändern.
Jörg Wunsch schrieb:> Rufus Τ. Firefly schrieb:>> Das ist aber problematisch, wenn eine IP-Adresse eine 255 enthält, was>> sie durchaus darf.>> Hast natürlich recht, die Logik muss man ändern.>>
1
>uint8_tff_seen=0;
2
>
3
>...
4
>if(b==0xff)ff_seen++;
5
>
6
>...
7
>returnff_seen<4;
8
>
Entweder so, oder ganz einfach den Spiess umdrehen:
Sobald was anderes als 0xFF kommt, ist die IP gültig