我是Frama-c的新手,我想了解这个简单例子的问题:
/*@ requires \valid(array+(0..length-1))
@ ensures \forall integer k; 0 <= k < length ==> array[k] == 0;
@ assigns array[0..length-1];
*/
void fill(int array[], int length){
/*@ loop invariant 0 <= i <= length;
@ loop invariant \forall integer k; 0 <= k < i ==> array[k] == 0;
@ loop assigns i, array[0..i-1];
@ loop variant length - i;
*/
for(int i = 0; i < length; i++){
array[i] = 0;
}
}
在这个例子中,Frama-c(WP + Value)不会证明函数契约中的assign子句,我无法理解为什么。任何帮助将不胜感激=)
答案 0 :(得分:3)
如果你削弱你的循环分配,这可以证明(使用alt-ergo 0.95.1)。
@ loop指定i,数组[0..length-1];
还需要前置条件i >= 0
,因为\valid(array+(0..length-1)
隐含 。 array+(0..length-1)
是length <= 0
的有效位置集,虽然是空的。
您的原始循环分配的事实并不意味着您的前提条件是对当前版本的WP插件的限制。