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