我可以跳过 eva 关于签名溢出的断言吗?

Can I skip eva's assertion on signed overflow?

示例代码:

void main(){
    unsigned int x;
    x = 1U << 31;  // OK
    x = 1 << 31; // Sign overflowed
    return;
}

frama-c-gui -eva main.c:

void main(void)
{
    unsigned int x;
    x = 1U << 31;
    /*@ assert Eva: signed_overflow: 1 << 31 ≤ 2147483647; */
    x = (unsigned int)(1 << 31);
    return;
}

由于第 4 行有符号溢出而收到红色警报。我有大量硬件寄存器的现有代码,这些寄存器是用掩码位和移位位定义的,就像这样。修改代码add "U" 不合理,所有mask位。 eval 插件中是否有将这些常量视为无符号整数的选项?

内核中有一些选项可以控制应发出哪种警报(有关详细信息,请参阅 frama-c -kernel-hmanual,尤其是其第 6.3 节)。

在您的特定情况下,您可能对 -no-warn-signed-overflow 感兴趣,它将禁用与有符号算术溢出相关的警报。然后,Eva 将采用 2 补码算法,并在这种情况发生时发出警告,但在整个分析过程中只发出一次。