Я использовал следующий фрагмент кода для чтения данных из файлов как часть более крупной программы.
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;
}
Теперь мне говорят использовать -O2
и я получаю следующее предупреждение gcc: warning: dereferencing type-punned pointer will break strict-aliasing rules
Google, я нашел два ортогональных ответа:
- Заключение: нет необходимости беспокоиться; gcc пытается быть более послушным законом, чем фактический закон.
против
- Таким образом, в основном, если у вас есть int * и float *, им не разрешено указывать на одно и то же место в памяти. Если ваш код не соблюдает это, оптимизатор компилятора, скорее всего, нарушит ваш код.
В конце концов, я не хочу игнорировать предупреждения. Чтобы вы посоветовали?
[update] Я заменил игрушечный пример реальной функцией.