В документации GCC говорится, что -Wstrict-aliasing=3
является наиболее точным уровнем и что более низкие уровни с большей вероятностью дают ложные срабатывания.
Я полагаю, что все следующие примеры нарушают правило строгого алиасинга:
float violate1(float a_float)
{
float * f_data(&a_float);
int * i_data((int *)f_data);
int value(*i_data);
return value + a_float;
}
float violate2(float a_float)
{
int * i_data((int *)&a_float);
int value(*i_data);
return value + a_float;
}
float violate3(float *f_data)
{
int * i_data((int *)f_data);
int value(*i_data);
return value + *f_data;
}
Тем не менее, g ++ выдает предупреждения для всех, только когда используется -Wstrict-aliasing=1
.
С -Wstrict-aliasing=3
предупреждения не выдаются: https://godbolt.org/g/aox2S1
Действительно ли примеры не являются нарушениями или же предупреждения GCC не являются достоверным признаком нарушений?