nal*_*zok 4 c gcc compiler-warnings gcc-warning
我注意到以下关于理解严格别名的代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
据作者说,
使用GCC 4.0编译时启用-Wstrict-aliasing = 2标志的上述源 将生成警告.这个警告是误报的一个例子.允许这种类型的强制转换,并生成相应的代码(见下文).清楚地记录了-Wstrict-aliasing = 2可能返回误报.
我想知道什么是误报,我应该在别名变量时注意它吗?
以下是上面提到的"适当的代码(见下文)",如果它是相关的:
-fstrict-aliasing -O3 -Wstrict-aliasing -std=c99在GNU C 4.0.0版(Apple Computer,Inc.build 5026)上编译(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
Run Code Online (Sandbox Code Playgroud)
这里的"误报"意味着警告不正确,并且实际上并不存在问题.假阳性是科学和医学中的标准术语,表示评估过程中的错误导致错误检测所测试的病症.(如果适当的话,误报就是没有发出警告.)
如果您确定警告是误报,则无需修复代码即可将其删除.您可能仍希望重新构建代码以避免编译警告(或者如果可能,请关闭该部分代码的警告).通常无警告的编译确保当出现真正的警告时,你应该注意一个,你不要错过它.