首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >frama-c wp插件无法验证手册中的交换函数。

frama-c wp插件无法验证手册中的交换函数。
EN

Stack Overflow用户
提问于 2015-09-04 14:14:37
回答 1查看 298关注 0票数 3

如何使frama-c -wp验证来自可湿性粉剂手册的示例--一个简单的swap函数(swap.c):

代码语言:javascript
复制
/* @ requires \valid(a) && \valid(b);
   @ ensures A: *a == \old(*b);
   @ ensures B: *b == \old(*a);
   @ assigns *a,*b;
   @*/
void swap(int * a, int * b);

void swap(int * a, int * b) {
    int tmp = * a;
    *a = *b;
    *b = tmp;
    return ;
}

调用

$frama -wp -wp-rte swap.c

给予:

代码语言:javascript
复制
[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing)
[kernel] Parsing swap.c (with preprocessing)
[wp] Running WP plugin...
[wp] Collecting axiomatic usage
[rte] annotating function swap
[wp] 4 goals scheduled
[wp] [Alt-Ergo] Goal typed_swap_assert_rte_mem_access_4 : Unknown (174ms)
[wp] [Alt-Ergo] Goal typed_swap_assert_rte_mem_access_2 : Unknown (160ms)
[wp] [Alt-Ergo] Goal typed_swap_assert_rte_mem_access : Unknown (154ms)
[wp] [Alt-Ergo] Goal typed_swap_assert_rte_mem_access_3 : Unknown (220ms)
[wp] Proved goals:    0 / 4
     Alt-Ergo:        0  (unknown: 4)

我不知道为什么

  1. 在我的尝试和手册中,目标的数量是不同的(4比9)?
  2. Alt(事实上,cvc3gappasimplifyverityicesz3)都不能放弃这4种证明义务中的任何一种?

我使用最新的OPAM安装:

  • frama-c:钠-20150201
  • alt-ergo:0.95.2 (来自ubuntu14.04主存储库包alt-ergo)
  • why3:0.86.1

证明义务的一个例子,由alt-ergo通过wp传递给它:

代码语言:javascript
复制
goal swap_assert_rte_mem_access:
  forall t : int farray.
  forall a_1,a : addr.
  linked(t) ->
  (region(a.base) <= 0) ->
  (region(a_1.base) <= 0) ->
  valid_rd(t, a, 1)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-04 18:28:58

在从WP手册中复制swap规范时,您犯了一个错误。(下一个版本将使用允许复制粘贴的字体。)在ACSL规范中,C注释的开头与@之间不能有空格;否则注释将被解释为简单的注释。因此,你实际上是在试图证明

代码语言:javascript
复制
void swap(int * a, int * b);

void swap(int * a, int * b) {
    int tmp = * a;
    *a = *b;
    *b = tmp;
    return ;
}

这当然是不可能的,因为ab可能不是有效的指针。

正确的规格是

代码语言:javascript
复制
/*@ requires \valid(a) && \valid(b);
  @ ensures A: *a == \old(*b);
  @ ensures B: *b == \old(*a);
  @ assigns *a,*b;
  @*/
void swap(int * a, int * b);

在小型示例中使用Frama时,您可能应该使用GUI界面(frama-c-gui)。这样,您将看到您的源代码后,正常化,什么RTE已经添加,等等。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32400261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档