我注意到Understanding Strict Aliasing上的以下代码:
uint32_t
swap_words( uint32_t arg )
{
U32* in = (U32*)&arg;
uint16_t lo = in->u16[0];
uint16_t hi = in->u16[1];
in->u16[0] = hi;
in->u16[1] = lo;
return (in->u32);
}
据作者说,
使用GCC 4.0编译时的上述源代码 -Wstrict-aliasing = 2 标志启用将生成警告。此警告是误报的示例。这种类型的演员是 允许并将生成适当的代码(见下文)。它是 明确记录 -Wstrict-aliasing = 2 可能会返回false 阳性。
我想知道什么是误报,在别名变量时我应该注意它吗?
如果相关的话,这是上面提到的“适当的代码(见下文)”:
在GNU C 4.0.0版(Apple Computer,Inc。build 5026)上编译-fstrict-aliasing -O3 -Wstrict-aliasing -std=c99
(powerpc-apple-darwin8),
swap_words:
stw r3,24(r1) ; Store arg
lhz r0,24(r1) ; Load hi
lhz r2,26(r1) ; Load lo
sth r0,26(r1) ; Store result[1] = hi
sth r2,24(r1) ; Store result[0] = lo
lwz r3,24(r1) ; Load result
blr ; Return
答案 0 :(得分:7)
这里有一个"误报"表示警告不正确,并且问题实际上并不存在。 误报是科学和医学中的标准术语,表示评估过程中的错误导致mistaken detection of a condition tested。 (如果适当的话,误判将无法发出警告。)
如果您确定警告是误报,则无需修复代码即可将其删除。您可能仍希望重新构建代码以避免编译警告(或者如果可能,请关闭该部分代码的警告)。通常无警告的编译确保当出现真正的警告时,你应该注意,你不要错过它。
答案 1 :(得分:3)
gcc使用特殊的启发式方法来查找严格别名规则的问题。这些启发式方法可能有错误的积极因素,即报告警告但没有任何报告的情况。
答案 2 :(得分:3)
误报一般意味着当某些事情假装答案是肯定的/符合某种情况时实际上它不是真的。
所以这里gcc给你一个关于从整数到相同大小的结构的错误转换的警告,它保存两个16位整数,因为它是危险的操作。但是你知道它实际上是正确的并且生成了正确的代码。