3

我正在学习使用经过验证的软件工具链 (VST)。我被困在证明一个简单的“if-then-else”块上。

这是 .c 文件:

int iftest(int a){
   int r=0; 
   if(a==2){
      r=0;
   else{
      r=0;
   }
return r;
}

我写了一个关于iftest()如下的规范:

Definition if_spec :=`
DECLARE _iftest`
      WITH a0:int
                PRE [_a OF tint]
                PROP ()
                LOCAL (`(eq (Vint a0)) (eval_id _a))
                SEP ()
                POST [tint]
                PROP ()
                LOCAL ((`(eq (Vint (Int.repr 0))) retval))
                SEP ().`

证明步骤是:

Lemma body_iftest : semax_body Vprog Gtot f_iftest if_spec.Proof. start_function. name a _a. name r _r. forward. (*r=0*) simplify_typed_comparison. forward. (*if(E)*). go_lower. subst. normalize.

它产生一个假设:Post := EX x : ?214, ?215 x : environ -> mpred“then”子句不能通过“go_lower”和“normalize”继续。

4

2 回答 2

1

在当前版本的 VST 中有一个forward_if PRED策略。以下是如何使用它来解决您的目标:

Require Import floyd.proofauto.
Require Import iftest.

Local Open Scope logic.
Local Open Scope Z.

Definition if_spec :=
  DECLARE _iftest
      WITH a0:int
                PRE [_a OF tint]
                PROP ()
                LOCAL (`(eq (Vint a0)) (eval_id _a))
                SEP ()
                POST [tint]
                PROP ()
                LOCAL ((`(eq (Vint (Int.repr 0))) retval))
                SEP ().

Definition Vprog : varspecs := nil.
Definition Gtot : funspecs := if_spec :: nil.

Lemma body_iftest : semax_body Vprog Gtot f_iftest if_spec.
Proof.
  start_function.
  name a _a.
  name r _r.
  forward.
  forward_if (PROP ()
                   LOCAL (`(eq (Vint (Int.repr 0))) (eval_id _r)) SEP()). 
  + forward.
    entailer.
  + forward.
    entailer.
  + forward.
Qed.

PS @bazza 关于}之前失踪的说法是正确的else。我假设它是固定的。

于 2015-01-11T18:24:42.910 回答
0

可能是一个没有帮助的答案,但我不禁注意到您的 .c 代码有 3 个 { 并且只有 2 个 },这表明它无法编译。您收到的错误消息可能与此有关吗?

于 2013-08-27T22:10:11.150 回答