无法证明分配条款 - Frama-C

时间:2013-05-23 09:48:11

标签: frama-c

我是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子句,我无法理解为什么。任何帮助将不胜感激=)

1 个答案:

答案 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插件的限制。