首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Frama-C acsl max示例来自人工不工作

Frama-C acsl max示例来自人工不工作
EN

Stack Overflow用户
提问于 2020-05-07 15:50:24
回答 2查看 430关注 0票数 0

我相信我错过了一些显而易见的东西,但我已经尝试了很多,但我还没有找到问题的根源。

我正在跟踪来自Frama的acsl 指南。下面是关于如何验证在数组中查找最大值的正确性的介绍性示例:

代码语言:javascript
复制
/*@ requires n > 0;
    requires \valid(p+ (0 .. n-1));
    ensures \forall int i; 0 <= i <= n-1 ==> \result >= p[i];
    ensures \exists int e; 0 <= e <= n-1 && \result == p[e];
*/
int max_seq(int* p, int n) {
  int res = *p;
  for(int i = 0; i < n; i++) {
    if (res < *p) { res = *p; }
    p++;
  }
  return res;
}

然而,在运行frama-c -wp -wp-prover alt-ergo samenum.c -then -report时,我得到:

代码语言:javascript
复制
[wp] Warning: Missing RTE guards
[wp] samenum.c:8: Warning: Missing assigns clause (assigns 'everything' instead)
[wp] 2 goals scheduled
[wp] [Alt-Ergo] Goal typed_max_seq_ensures_2 : Timeout (Qed:1ms) (10s)
[wp] [Alt-Ergo] Goal typed_max_seq_ensures : Timeout (Qed:2ms) (10s)
[wp] Proved goals:    0 / 2
  Alt-Ergo:        0  (interrupted: 2)
[report] Computing properties status...

--------------------------------------------------------------------------------
--- Properties of Function 'max_seq'
--------------------------------------------------------------------------------

[    -    ] Post-condition (file samenum.c, line 3)
            tried with Wp.typed.
[    -    ] Post-condition (file samenum.c, line 4)
            tried with Wp.typed.
[    -    ] Default behavior
            tried with Frama-C kernel.

在证明财产之前,alt-ergo似乎已经超时了。值得的是,我尝试了更高的超时时间,但仍然不起作用。

我正在使用:

  • frama-c: 19.1
  • why3: 1.2.0
  • 备选案文-因此: 2.3.2

我在Ubuntu18.04上运行这个命令,在运行命令之前运行:why3 config --detect,以确保why3了解alt。

有什么想法吗?有人能证实这是个例子不起作用吗?任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-11 07:54:54

这个迷你教程写了很久以前,并不是真正的最新。新版本的网站应该出现在未来几个月。基本上,这个契约以及@iguerNL指出的循环的不变量都是使用Jessie插件,而不是Frama的WP插件来验证的。在这两个插件之间的区别中,Jessie不需要循环和函数的assigns子句,而WP需要它们。

因此,一个完整的带注释的max_seq函数可以是这样的:

代码语言:javascript
复制
/*@ requires n > 0; 
    requires \valid(p+ (0..n−1));
    assigns \nothing;
    ensures \forall int i; 0 <= i <= n−1 ==> \result >= p[i]; 
    ensures \exists int e; 0 <= e <= n−1 && \result == p[e]; 
*/ 
int max_seq(int* p, int n) { 
  int res = *p; 
  //@ ghost int e = 0; 
  /*@ loop invariant \forall integer j; 0 <= j < i ==> res >= \at(p[j],Pre); 
      loop invariant \valid(\at(p,Pre)+e) && \at(p,Pre)[e] == res; 
      loop invariant 0<=i<=n; 
      loop invariant p==\at(p,Pre)+i; 
      loop invariant 0<=e<n; 
      loop assigns i, res, p, e;
      loop variant n-i;
  */ 
  for(int i = 0; i < n; i++) { 
    if (res < *p) { 
      res = *p; 
      //@ ghost e = i; 
    }
    p++; 
  } 
  return res; 
}

其中,我们指定函数没有分配内存中的任何内容,并且循环分配不同的局部变量irespe (因此保持n不变)。

请注意,最近的教程可以用来了解Frama与WP插件的使用情况。Frama网站的未来版本提到:

票数 3
EN

Stack Overflow用户

发布于 2020-05-07 17:24:39

您可能忘记为" for“循环添加不变量。请参阅您提供的手册中的"10.2循环不变量“一节(index.html)。

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

https://stackoverflow.com/questions/61662107

复制
相关文章

相似问题

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