Skip to content

Commit f4a7005

Browse files
namasikanamstrub
authored andcommitted
fix the free memory of the second goal of byehoare
The second goal generated from byehoare is unsound, in which the procedure arguments are bound in a free memory. This is a small bug introduced in #789 . We need to bind the precondition to the memory in probability expression.
1 parent b46c8c7 commit f4a7005

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

src/phl/ecPhlDeno.ml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ let t_phoare_deno_r pre post tc =
8686

8787
(* -------------------------------------------------------------------- *)
8888
let t_ehoare_deno_r pre post tc =
89+
assert (pre.m = post.m);
90+
let m = pre.m in
8991
let env, _, concl = FApi.tc1_eflat tc in
9092

9193
let f, bd =
@@ -99,11 +101,11 @@ let t_ehoare_deno_r pre post tc =
99101

100102
let pr = destr_pr f in
101103
let concl_e = f_eHoareF pre pr.pr_fun post in
102-
let mpr, mpo = EcEnv.Fun.hoareF_memenv pr.pr_mem pr.pr_fun env in
104+
let _, mpo = EcEnv.Fun.hoareF_memenv m pr.pr_fun env in
103105
(* pre <= bd *)
104106
(* building the substitution for the pre *)
105-
let sargs = PVM.add env pv_arg (fst mpr) pr.pr_args PVM.empty in
106-
let smem = Fsubst.f_bind_mem Fsubst.f_subst_id (fst mpr) pr.pr_mem in
107+
let sargs = PVM.add env pv_arg m pr.pr_args PVM.empty in
108+
let smem = Fsubst.f_bind_mem Fsubst.f_subst_id m pr.pr_mem in
107109
let pre = Fsubst.f_subst smem (PVM.subst env sargs pre.inv) in
108110
let concl_pr = f_xreal_le pre (f_r2xr bd) in
109111

tests/byehoare-arg.ec

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require import AllCore Int Real Xreal.
2+
3+
module M = {
4+
proc main_int(x : int) = {
5+
return x;
6+
}
7+
8+
proc main_bool(x : bool) = {
9+
return x;
10+
}
11+
}.
12+
13+
lemma L &m (_x : int):
14+
Pr [ M.main_int(_x) @ &m : _x = res ] <= 1%r.
15+
proof.
16+
byehoare (_: ((arg = _x) `|` (1%xr)) ==> _) => //.
17+
- proc; auto => &hr.
18+
by apply xle_cxr_r => ->.
19+
qed.
20+
21+
lemma L1 (&m: {arg: bool}): !arg{m} =>
22+
Pr [ M.main_bool(true) @ &m : true] <= 0%r.
23+
proof.
24+
move => arg_eq.
25+
byehoare (_: (!arg{m})%xr ==> _) => //.
26+
proc; auto. by rewrite arg_eq.
27+
qed.

0 commit comments

Comments
 (0)