如何证明这个assign子句?

时间:2018-10-29 23:30:30

标签: frama-c

/*@
  @ requires \valid(p);
  @ assigns \nothing;
*/
void foo(int *p)
{
    int *pb;
    pb = p;
    *pb = 1;
    return;
}

void main(){
    int a = 0;
    foo(&a);
    return;
}

据我了解,函数协定的assigns子句仅适用于函数的输入变量。因此,我将assigns子句设为空,但使用-wp表示黄色。

frama-c -wp test1.c
[kernel] Parsing test1.c (with preprocessing)
[wp] Warning: Missing RTE guards
[wp] 3 goals scheduled
[wp] [Alt-Ergo] Goal typed_foo_assign_part2 : Unknown (Qed:4ms) (51ms)
[wp] Proved goals:    2 / 3
Qed:             2 
Alt-Ergo:        0  (unknown: 1)

如果赋值\ nothing不起作用,如何证明foo()?

1 个答案:

答案 0 :(得分:0)

我不确定“ assigns [...]仅适用于函数的输入变量”的含义。一个assigns子句应该给出在合同的前后状态中分配的所有内存位置的超集(有处理动态(取消)分配的特定子句),并且可以对其进行修改在执行功能(或声明合同的声明)期间。

尤其是,函数foo不能包含assigns \nothing;子句,因为它会修改p所指向的位置的值:您必须具有类似{{1} },这很容易被assigns *p;证明。