我正在分析一个具有以下结构的控制程序:
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, 哈拉尔德
答案 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插件。
关于你的其余问题,有更好的方法可以更好地利用分析所需的数量,但可能没有什么可以帮助你。