高回路边界的值分析

时间:2016-03-17 14:02:36

标签: frama-c value-analysis

我正在分析一个具有以下结构的控制程序:

unsigned int cnt=0;
unsigned int inc=3;
...

void main(){
int i;
int lim;

for(i=0;i<100000;i++)
{
  f1();
 ....
  lim = f2();
  if(cnt < lim)
    cnt += inc;
 ....
}
}

我的目标是分析足够的循环迭代,以显示cnt变量不会溢出。由于状态空间会变得过高,因此单独增加滑块将无济于事。我看到可以根据个别功能调整滑块。这例如也可能吗?一个if / else构造?对于这样的环路结构,增加整个功能的滑块可能已经太多了。 如果没有编写复杂的循环不变量和断言,有没有办法证明没有溢出?

BR, 哈拉尔德

1 个答案:

答案 0 :(得分:1)

我冒昧地指定f2返回正面的东西。否则,测试if(cnt < lim)执行否定 - &gt;无符号转换,Value目前无法精确处理。事实上,如果f2始终返回-1,则您的媒体资源 不会暂停!

根据这一假设,cnt 溢出。

unsigned int cnt=0;
unsigned int inc=3;

//@ assigns \result \from \nothing; ensures 0 <= \result;
int f2();

void main(){
  int i;
  int lim;

  for(i=0;i<100000;i++)
    {
      f1();
      lim = f2();      
      if(cnt < lim)
        cnt += inc;
    }
}

这是分析的结果。 cnt没有溢出,因为它的最大值是4294967295。

[value] Values at end of function main:
  cnt ∈ [0..2147483649],0%3
  i ∈ {100000}
  lim ∈ [0..2147483647]

如果f2可以返回负值&lt; = -4,我不确定结果是否可以在不使用例如WP插件。

关于你的其余问题,有更好的方法可以更好地利用分析所需的数量,但可能没有什么可以帮助你。