我正在尝试使用frama-c验证以下代码
/*@ ensures \result != \null;
@ assigns \nothing;
@*/
extern int *new_value();
//@ assigns *p;
void f(int* p){
*p = 8;
}
//@ assigns \nothing;
int main(void){
int *p = new_value();
f(p);
}
证明者无法证明 main 分配\ no,这是有意义的,因为 main 通过函数 f 分配给* p。但是,我应该如何在\ _signigns子句中声明,因为 p 是局部变量,并且无法在注释中访问。
答案 0 :(得分:3)
assigns nothing
确实是假的。变量p
是本地的,但效果是在*p
上完成的,new_value
是一个任意指针。
如果int g;
int *new_value(){
return &g;
}
定义如下:
g
它符合规范,8
的值在主要末尾为new_value
。
如果问题是能够在不知道函数new_value
的行为的情况下给函数main赋值,则可以从逻辑空间访问//@ logic int * R ;
//@ ensures \result == R && \valid(R) ; assigns \nothing ;
extern int *new_value();
//@ assigns *p;
void f(int * p) { … }
//@ assigns *R ;
int main(void) { … }
的结果:
例如:
{{1}}
更通用的解决方案是为R设置一组指针,而不是唯一的指针。