我正在尝试使用Frama-C的Eva插件分析C源代码。
在下面的示例中,我发现Eva可以计算右侧值较大的shift表达式的值,但是当右侧值较小时无法计算。
extern unsigned char a;
int main() {
int b, c, d;
b = (a >> 15) & 1;
c = (a >> 0) & 1;
d = b + c;
}
在上面的示例中,Eva可以计算b的值,但不能计算c的值。
对于Eva,(a >> 0) & 1
比(a >> 15) & 1
更复杂吗?
答案 0 :(得分:0)
Eva从初始上下文中给出最精确的答案,其中外部变量a
的范围为[0..255]
,即b
等于0
和c
可以是0
或1
。
如果您想了解正在发生的事情,则可以使用图形用户界面底部的Values
面板(由frama-c-gui -eva file.c
启动)。 the Eva user manual的第4.3节中记录了它的用法,但是基本上,如果您在规范化代码视图(左缓冲区)中单击任何(子)表达式,此时Eva为该表达式计算的抽象值将显示在面板中。
在您的示例中,我们使用以下中间值来计算b
:
a
-> [0..255]
(int)a
-> [0..255]
(隐式提升算术操作数)(int)a >> 15
-> {0}
(仅前8位可能不是0
)(int)a >> 15 & 1
-> {0}
(第一个参数是0
,按位,也是0
} 对于c
,前两个步骤是相同的,但随后我们有
(int)a >> 0
-> [0..255]
(不,我们的值与(int)a
相同)((int)a >> 0) & 1
-> {0; 1}
(在间隔[0..255]
中,我们有奇数和偶数,因此按位运算的结果可以是0
或{{ 1}})。