为什么Eva插件可以计算“(a >> 15)&1”而不能计算“(a >> 0)&1”?

时间:2019-07-01 06:20:49

标签: frama-c

我正在尝试使用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更复杂吗?

1 个答案:

答案 0 :(得分:0)

Eva从初始上下文中给出最精确的答案,其中外部变量a的范围为[0..255],即b等于0c可以是01

如果您想了解正在发生的事情,则可以使用图形用户界面底部的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}})。