/*@
@ 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()?
答案 0 :(得分:0)
我不确定“ assigns
[...]仅适用于函数的输入变量”的含义。一个assigns
子句应该给出在合同的前后状态中分配的所有内存位置的超集(有处理动态(取消)分配的特定子句),并且可以对其进行修改在执行功能(或声明合同的声明)期间。
尤其是,函数foo
不能包含assigns \nothing;
子句,因为它会修改p
所指向的位置的值:您必须具有类似{{1} },这很容易被assigns *p;
证明。