什么是“误报”?

时间:2016-02-12 07:35:55

标签: c gcc compiler-warnings gcc-warning

我注意到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

3 个答案:

答案 0 :(得分:7)

这里有一个"误报"表示警告不正确,并且问题实际上并不存在。 误报是科学和医学中的标准术语,表示评估过程中的错误导致mistaken detection of a condition tested。 (如果适当的话,误判将无法发出警告。)

如果您确定警告是误报,则无需修复代码即可将其删除。您可能仍希望重新构建代码以避免编译警告(或者如果可能,请关闭该部分代码的警告)。通常无警告的编译确保当出现真正的警告时,你应该注意,你不要错过它。

答案 1 :(得分:3)

gcc使用特殊的启发式方法来查找严格别名规则的问题。这些启发式方法可能有错误的积极因素,即报告警告但没有任何报告的情况。

答案 2 :(得分:3)

误报一般意味着当某些事情假装答案是肯定的/符合某种情况时实际上它不是真的。

所以这里gcc给你一个关于从整数到相同大小的结构的错误转换的警告,它保存两个16位整数,因为它是危险的操作。但是你知道它实际上是正确的并且生成了正确的代码。