我可以跳过 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-h
或 manual,尤其是其第 6.3 节)。
在您的特定情况下,您可能对 -no-warn-signed-overflow
感兴趣,它将禁用与有符号算术溢出相关的警报。然后,Eva 将采用 2 补码算法,并在这种情况发生时发出警告,但在整个分析过程中只发出一次。
示例代码:
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-h
或 manual,尤其是其第 6.3 节)。
在您的特定情况下,您可能对 -no-warn-signed-overflow
感兴趣,它将禁用与有符号算术溢出相关的警报。然后,Eva 将采用 2 补码算法,并在这种情况发生时发出警告,但在整个分析过程中只发出一次。