在Frama-C中执行WP内存模型所做的假设

时间:2019-03-11 19:59:37

标签: frama-c

是否有一种方法可以强制执行WP内存模型所做的假设?

请考虑以下两个要用Frama-C验证的功能:

/*@ requires \valid(a) && \valid(b);
  @ ensures A: *a == 1;
  @ ensures B: *b == 2;
  @ assigns *a, *b;
  @*/
void assign_many(int *a, int *b)
{
  *a = 1;
  *b = 2;
}


int main() {
  int a = 42;
  assign_many(&a, &a);
  //@ assert a == 1;
  //@ assert a == 2;
  return 0;
}

在一般情况下,函数assign_many无法验证,因为这两个参数可以互为别名(如main中所示)。但是,如果您选择Hoare+ref内存模型,则此函数会进行验证,因为它假定是分离的。但是即使使用main内存模型,我仍然可以验证Typed。使用命令行选项-wp-warn-memory-model时,将显示一条消息,警告您有关内存模型的假设。是否有可能执行这些假设,例如将它们作为前提添加到assign_many

1 个答案:

答案 0 :(得分:0)

恐怕这是不可能直接实现的(即,如果没有将生成的规范复制粘贴到新的C文件中并重新分析整个源代码:警告文本似乎将其表示为有效的ACSL合同)

深入研究Wp插件的API,可以看出,分离假设在该插件的MemoryContext模块中得到了处理,该模块使用其自己的自定义数据类型来表示它们(与内核中定义的标准AST的ACSL谓词相反。

有可能编写一些代码,这些代码将采用给定模型为给定函数生成的子句,并生成一组ACSL谓词,然后可以将其添加为该函数的requires子句(即,等同于上述复制粘贴),但这意味着对Frama-C API有一定了解。