已验证的软件工具链:if-then-else证明

时间:2013-08-20 07:30:12

标签: coq verifiable-c

我正在学习使用经过验证的软件工具链(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”继续。

2 个答案:

答案 0 :(得分: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.

P.S。 @bazza正好在}之前遗失else。我认为它是固定的。

答案 1 :(得分:0)

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