【发布时间】:2018-05-17 16:13:21
【问题描述】:
GCC's documentation 表示-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;
}
然而,当使用-Wstrict-aliasing=1 时,g++ 只会对它们发出警告。
使用-Wstrict-aliasing=3 不会发出警告:https://godbolt.org/g/aox2S1
这些示例实际上不是违规行为,还是 GCC 的警告不是违规行为的可靠指示?
【问题讨论】:
-
fwiw 警告不能 100% 可靠,如果是,它们可能是错误
-
那些是严格的别名违规。 3 更准确:误报更少,但漏掉了一些真阳性,1 得到更多真阳性,但也有更多误报。
标签: c++ gcc language-lawyer strict-aliasing