Ich verwendete den folgenden Codeabschnitt, um Daten aus Dateien als Teil eines größeren Programms zu lesen.Dereferenzieren von Typ-Punzed Pointer bricht strenge Aliasing-Regeln
double data_read(FILE *stream,int code) {
char data[8];
switch(code) {
case 0x08:
return (unsigned char)fgetc(stream);
case 0x09:
return (signed char)fgetc(stream);
case 0x0b:
data[1] = fgetc(stream);
data[0] = fgetc(stream);
return *(short*)data;
case 0x0c:
for(int i=3;i>=0;i--)
data[i] = fgetc(stream);
return *(int*)data;
case 0x0d:
for(int i=3;i>=0;i--)
data[i] = fgetc(stream);
return *(float*)data;
case 0x0e:
for(int i=7;i>=0;i--)
data[i] = fgetc(stream);
return *(double*)data;
}
die("data read failed");
return 1;
}
Jetzt bin ich sagte -O2
zu verwenden, und ich bekomme folgende gcc Warnung: warning: dereferencing type-punned pointer will break strict-aliasing rules
googleing Ich fand zwei orthogonal Antworten:
vs
Am Ende will ich nicht die Warnungen ignorieren. Was würden Sie empfehlen?
[Update] Ich ersetzte das Spielzeug Beispiel mit der realen Funktion.
Ihre Funktion eine doppelte zurückkehrt, aber Sie Wirf deine Rückkehr auf einen Int. Warum nicht zu verdoppeln? –
Mein Lesen der bereitgestellten Links: bytes.com Link scheint größtenteils falsch zu sein (tatsächlich haben sich die Dinge seit GCC 4.x veröffentlicht), während SO Link scheint in Ordnung zu sein. Siehe C99, "6.5 Expressions", Abschnitt 7. – Dummy00001
Ich bin ein bisschen verwirrt wegen der Fehlermeldung, weil ich dachte, dass Alias-Regeln char-Typen ausschließen (dh ein 'char'-Pointer darf immer andere Pointer aliasieren, es sei denn, es ist restricte 'ed.) Vielleicht musst du es" unsigned char "machen, damit es sich bewerben kann ..? Ich wäre daran interessiert, die richtige Antwort zu sehen. –