在Frama-C中为局部变量分配子句

时间:2014-10-27 16:01:05

标签: frama-c

我正在尝试使用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 是局部变量,并且无法在注释中访问。

1 个答案:

答案 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设置一组指针,而不是唯一的指针。