Utilicé el siguiente fragmento de código para leer datos de archivos como parte de un programa más grande.El puntero de punteo de tipo de desreferenciación romperá las reglas de alias estrictos
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;
}
Ahora me dicen utilizar -O2
y me da aviso siguiente GCC: warning: dereferencing type-punned pointer will break strict-aliasing rules
Googleing encontré dos respuestas ortogonales:
vs
Al final no quiero hacer caso omiso de las advertencias. ¿Qué recomendarías?
[update] He sustituido el ejemplo de juguete con la función real.
Su función devuelve un doble, pero lanza tu regreso a un int. ¿Por qué no lanzar al doble? –
Mi lectura del enlace provisto: el enlace bytes.com parece ser en su mayoría erróneo (en realidad, las cosas han cambiado desde que se lanzó GCC 4.x), mientras que el enlace SO parece estar bien. Ver C99, "6.5 Expressions", cláusula 7. – Dummy00001
Estoy un poco confundido por el mensaje de error porque pensé que las reglas de aliasing excluían los tipos 'char' (es decir, un puntero' char' siempre permite alias otros punteros a menos que sea 'restrict 'ed.) Tal vez tengas que hacer que 'unsigned char' para que se aplique ... Me interesaría ver la respuesta correcta. –