From e59915796c299da219c4cc265cec4a7ca65b89e2 Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Wed, 29 Apr 2020 15:21:58 +0200
Subject: [PATCH] [wp] Improves MemVar assigned + fixes range on comp

---
 src/plugins/wp/MemVar.ml                      |  59 +++++-----
 .../assigned_initialized_memvar.res.oracle    | 101 +++++++++++-------
 .../assigned_initialized_memtyped.res.oracle  |   1 -
 .../0bca5f490c163f9a2d1bc5be85a938cb.json     |   2 +-
 .../0ea068d1821f3b958beb619aabd2bf71.json     |   2 -
 .../26f2bec626edf9f3b21ce506a0dbc878.json     |   2 -
 .../2ff76ae8947b7c9d0efda0d01090aeec.json     |   2 +
 .../32c205ac1281122e19bed393f47b07af.json     |   2 +
 .../47fdc2d6da39295871208bb185768ba9.json     |   2 -
 .../5829cd050c6e5edf4241b52cfb347dbc.json     |   2 -
 .../7790b93ea943473c622f27192935dc0e.json     |   2 +
 .../81f6bbec14f78ded8be06b4d83acbdca.json     |   2 -
 .../9fc719583241f8c265dc2b57924b4e5c.json     |   2 +
 .../ad4c4ee63d285e19bebf51be10f2d5da.json     |   2 +-
 .../c17ff689fb984c1d15fced512cddb9f0.json     |   2 -
 ... => ed2046f443d594d7a695098d6732bd53.json} |   0
 .../f65786f87e448872f8395e84331fc2fa.json     |   2 +
 .../f6db810f4dc379e72d7a04df0c9b64f5.json     |   2 +-
 .../f84e2f80d92f69c9bae45d521a10486b.json     |   2 +
 .../fbb170335579f1933320c49f3fd8f1ca.json     |   2 -
 .../fe9862be590507dedbd24e64a535ac03.json     |   2 +
 .../assigned_initialized_memvar.res.oracle    |   1 -
 .../initialized_memtyped.res.oracle           |   1 -
 .../initialized_memvar.res.oracle             |   1 -
 24 files changed, 116 insertions(+), 82 deletions(-)
 delete mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/0ea068d1821f3b958beb619aabd2bf71.json
 delete mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/26f2bec626edf9f3b21ce506a0dbc878.json
 create mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/2ff76ae8947b7c9d0efda0d01090aeec.json
 create mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/32c205ac1281122e19bed393f47b07af.json
 delete mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/47fdc2d6da39295871208bb185768ba9.json
 delete mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/5829cd050c6e5edf4241b52cfb347dbc.json
 create mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/7790b93ea943473c622f27192935dc0e.json
 delete mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/81f6bbec14f78ded8be06b4d83acbdca.json
 create mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/9fc719583241f8c265dc2b57924b4e5c.json
 delete mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/c17ff689fb984c1d15fced512cddb9f0.json
 rename src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/{532fc8247c18cc12fc05c6dca37a85df.json => ed2046f443d594d7a695098d6732bd53.json} (100%)
 create mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/f65786f87e448872f8395e84331fc2fa.json
 create mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/f84e2f80d92f69c9bae45d521a10486b.json
 delete mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/fbb170335579f1933320c49f3fd8f1ca.json
 create mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/fe9862be590507dedbd24e64a535ac03.json

diff --git a/src/plugins/wp/MemVar.ml b/src/plugins/wp/MemVar.ml
index 18b4f8959f7..c80e3d856df 100644
--- a/src/plugins/wp/MemVar.ml
+++ b/src/plugins/wp/MemVar.ml
@@ -1046,12 +1046,13 @@ struct
         let sub = initialized_loc sigma obj x ofs in
         Lang.F.p_forall [v] (p_imply hyp sub)
     | C_comp _ ->
-        let leaf = match Extlib.last ofs with
-          | Field f -> Ctypes.object_of f.ftype
-          | Shift(obj, _) -> obj
+        let hd = match ofs with
+          | Field f :: _ -> Ctypes.object_of f.ftype
+          | Shift(obj, _) :: _ -> obj
+          | [] -> assert false
         in
-        begin match leaf with
-          | C_array _ -> initialized_range sigma leaf x ofs low up
+        begin match hd with
+          | C_array _ -> initialized_range sigma hd x ofs low up
           | _ -> raise ShiftMismatch
         end
     | _ ->
@@ -1192,6 +1193,7 @@ struct
   (* -------------------------------------------------------------------------- *)
 
   let rec assigned_path
+      kind
       (hs : pred list) (* collector of properties *)
       (xs : var list)  (* variable quantifying the assigned location *)
       (ys : var list)  (* variable quantifying others locations *)
@@ -1203,14 +1205,14 @@ struct
       (*TODO: optimized version for terminal [Field _] and [Index _] *)
 
       | Field f :: ofs ->
-          let cf = Cfield (f, KValue) in
+          let cf = Cfield (f, kind) in
           let af = e_getfield a cf in
           let bf = e_getfield b cf in
-          let hs = assigned_path hs xs ys af bf ofs in
+          let hs = assigned_path kind hs xs ys af bf ofs in
           List.fold_left
             (fun hs g ->
                if Fieldinfo.equal f g then hs else
-                 let cg = Cfield (g, KValue) in
+                 let cg = Cfield (g, kind) in
                  let ag = e_getfield a cg in
                  let bg = e_getfield b cg in
                  let eqg = p_forall ys (p_equal ag bg) in
@@ -1225,7 +1227,7 @@ struct
           if List.exists (fun x -> F.occurs x e) xs then
             (* index [e] is covered by [xs]:
                must explore deeper the remaining path. *)
-            assigned_path hs xs (y::ys) ak bk ofs
+            assigned_path kind hs xs (y::ys) ak bk ofs
           else
             (* index [e] is not covered by [xs]:
                any index different from e is disjoint.
@@ -1234,7 +1236,7 @@ struct
             let be = e_get b e in
             let ek = p_neq e k in
             let eqk = p_forall (y::ys) (p_imply ek (p_equal ak bk)) in
-            assigned_path (eqk :: hs) xs ys ae be ofs
+            assigned_path kind (eqk :: hs) xs ys ae be ofs
 
   let assigned_genset s xs mem x ofs p =
     let valid = valid_offset_path s.post Sigs.RW mem x ofs in
@@ -1243,9 +1245,24 @@ struct
     let a_ofs = access a ofs in
     let b_ofs = access b ofs in
     let p_sloc = p_forall xs (p_hyps [valid;p_not p] (p_equal a_ofs b_ofs)) in
-    let conds = assigned_path [p_sloc] xs [] a b ofs in
+    let conds = assigned_path KValue [p_sloc] xs [] a b ofs in
     List.map (fun p -> Assert p) conds
 
+  let monotonic_initialized_genset s xs mem x ofs p =
+    if x.vformal || x.vglob then [Assert p_true]
+    else
+      let valid = valid_offset_path s.post Sigs.RW mem x ofs in
+      let a = get_init_term s.pre x in
+      let b = get_init_term s.post x in
+      let a_ofs = access_init a ofs in
+      let b_ofs = access_init b ofs in
+      let not_p = p_forall xs (p_hyps [valid;p_not p] (p_equal a_ofs b_ofs)) in
+      let exact_p =
+        p_forall xs (p_hyps [valid; p] (p_imply (p_bool a_ofs) (p_bool b_ofs)))
+      in
+      let conds = assigned_path KInit [not_p; exact_p] xs [] a b ofs in
+      List.map (fun p -> Assert p) conds
+
   (* -------------------------------------------------------------------------- *)
   (* ---  Assigned                                                          --- *)
   (* -------------------------------------------------------------------------- *)
@@ -1263,14 +1280,14 @@ struct
             | None -> unsized_array ()
             | Some { arr_size } -> arr_size
           in
-          let low = (e_int 0) in
-          let up = (e_int (size-1)) in
           let v = Lang.freshvar ~basename:"i" Lang.t_int in
-          let hyp = p_and (p_leq low (e_var v)) (p_leq (e_var v) up) in
           let obj = Ctypes.object_of t in
           let ofs = ofs @ [ Shift(obj, e_var v) ] in
-          let sub = monotonic_initialized seq obj x ofs in
-          Lang.F.p_forall [v] (p_imply hyp sub)
+          let low = Some (e_int 0) in
+          let up = Some (e_int (size-1)) in
+          let hyp = Vset.in_range (e_var v) low up in
+          let in_range = monotonic_initialized seq obj x ofs in
+          Lang.F.p_forall [v] (p_imply hyp in_range)
       | C_comp ci ->
           let mk_pred f =
             let obj = Ctypes.object_of f.ftype in
@@ -1331,10 +1348,7 @@ struct
         let k = Lang.freshvar ~basename:"k" Qed.Logic.Int in
         let p = Vset.in_range (e_var k) a b in
         let ofs = ofs_shift elt (e_var k) ofs in
-        let obj_x = Ctypes.object_of x.vtype in
-        let init = e_var (Lang.freshvar ~basename:"v" (init_of_object obj_x)) in
-        Assert(monotonic_initialized seq obj_x x []) ::
-        (memvar_set_init seq x [] init) @
+        (monotonic_initialized_genset seq [k] m x ofs p) @
         (assigned_genset seq [k] m x ofs p)
 
   let assigned_descr seq obj xs l p =
@@ -1345,10 +1359,7 @@ struct
     | Val((HEAP|CTXT|CARR) as m,x,ofs) ->
         M.assigned (mseq_of_seq seq) obj (Sdescr(xs,mloc_of_path m x ofs,p))
     | Val((CVAL|CREF) as m,x,ofs) ->
-        let obj_x = Ctypes.object_of x.vtype in
-        let init = e_var (Lang.freshvar ~basename:"v" (init_of_object obj_x)) in
-        Assert(monotonic_initialized seq obj_x x []) ::
-        (memvar_set_init seq x [] init) @
+        (monotonic_initialized_genset seq xs m x ofs p) @
         (assigned_genset seq xs m x ofs p)
 
   let assigned seq obj = function
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memvar.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memvar.res.oracle
index 71276a1d27b..ed0a5eb4569 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memvar.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memvar.res.oracle
@@ -83,10 +83,12 @@ Assume {
   Have: 10 <= i_1.
   (* Loop assigns ... *)
   Have: ((s.F1_S_i) = 0) /\ ((Init_s_0.Init_F1_S_i)=true) /\
-      (forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 9) -> ((v[i_3]=true) ->
-       (a[i_3]=true))))) /\
       (forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 9) ->
-       (((i_3 <= 0) \/ (5 <= i_3)) -> ((s.F1_S_a)[i_3] = v_1[i_3]))))).
+       (((i_3 <= 0) \/ (5 <= i_3)) -> ((a[i_3]=true) <-> (v[i_3]=true)))))) /\
+      (forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 9) ->
+       (((i_3 <= 0) \/ (5 <= i_3)) -> ((s.F1_S_a)[i_3] = v_1[i_3]))))) /\
+      (forall i_3 : Z. ((0 < i_3) -> ((0 <= i_3) -> ((i_3 <= 4) ->
+       ((i_3 <= 9) -> ((v[i_3]=true) -> (a[i_3]=true))))))).
   (* Else *)
   Have: 10 <= i_2.
 }
@@ -109,10 +111,12 @@ Assume {
   Have: 10 <= i_1.
   (* Loop assigns ... *)
   Have: ((s.F1_S_i) = 0) /\ ((Init_s_0.Init_F1_S_i)=true) /\
-      (forall i_4 : Z. ((0 <= i_4) -> ((i_4 <= 9) -> ((v[i_4]=true) ->
-       (a[i_4]=true))))) /\
       (forall i_4 : Z. ((0 <= i_4) -> ((i_4 <= 9) ->
-       (((i_4 <= 0) \/ (5 <= i_4)) -> ((s.F1_S_a)[i_4] = v_1[i_4]))))).
+       (((i_4 <= 0) \/ (5 <= i_4)) -> ((a[i_4]=true) <-> (v[i_4]=true)))))) /\
+      (forall i_4 : Z. ((0 <= i_4) -> ((i_4 <= 9) ->
+       (((i_4 <= 0) \/ (5 <= i_4)) -> ((s.F1_S_a)[i_4] = v_1[i_4]))))) /\
+      (forall i_4 : Z. ((0 < i_4) -> ((0 <= i_4) -> ((i_4 <= 4) ->
+       ((i_4 <= 9) -> ((v[i_4]=true) -> (a[i_4]=true))))))).
   (* Else *)
   Have: 10 <= i_2.
   (* Else *)
@@ -136,10 +140,12 @@ Assume {
   Have: 10 <= i_1.
   (* Loop assigns ... *)
   Have: ((s.F1_S_i) = 0) /\ ((Init_s_0.Init_F1_S_i)=true) /\
-      (forall i_4 : Z. ((0 <= i_4) -> ((i_4 <= 9) -> ((v[i_4]=true) ->
-       (a[i_4]=true))))) /\
       (forall i_4 : Z. ((0 <= i_4) -> ((i_4 <= 9) ->
-       (((i_4 <= 0) \/ (5 <= i_4)) -> ((s.F1_S_a)[i_4] = v_1[i_4]))))).
+       (((i_4 <= 0) \/ (5 <= i_4)) -> ((a[i_4]=true) <-> (v[i_4]=true)))))) /\
+      (forall i_4 : Z. ((0 <= i_4) -> ((i_4 <= 9) ->
+       (((i_4 <= 0) \/ (5 <= i_4)) -> ((s.F1_S_a)[i_4] = v_1[i_4]))))) /\
+      (forall i_4 : Z. ((0 < i_4) -> ((0 <= i_4) -> ((i_4 <= 4) ->
+       ((i_4 <= 9) -> ((v[i_4]=true) -> (a[i_4]=true))))))).
   (* Else *)
   Have: 10 <= i_2.
   (* Else *)
@@ -176,10 +182,12 @@ Assume {
   Have: 10 <= i_1.
   (* Loop assigns ... *)
   Have: ((s.F1_S_i) = 0) /\ ((Init_s_0.Init_F1_S_i)=true) /\
-      (forall i_5 : Z. ((0 <= i_5) -> ((i_5 <= 9) -> ((v_1[i_5]=true) ->
-       (a[i_5]=true))))) /\
       (forall i_5 : Z. ((0 <= i_5) -> ((i_5 <= 9) ->
-       (((i_5 <= 0) \/ (5 <= i_5)) -> ((s.F1_S_a)[i_5] = v_2[i_5]))))).
+       (((i_5 <= 0) \/ (5 <= i_5)) -> ((a[i_5]=true) <-> (v_1[i_5]=true)))))) /\
+      (forall i_5 : Z. ((0 <= i_5) -> ((i_5 <= 9) ->
+       (((i_5 <= 0) \/ (5 <= i_5)) -> ((s.F1_S_a)[i_5] = v_2[i_5]))))) /\
+      (forall i_5 : Z. ((0 < i_5) -> ((0 <= i_5) -> ((i_5 <= 4) ->
+       ((i_5 <= 9) -> ((v_1[i_5]=true) -> (a[i_5]=true))))))).
   (* Else *)
   Have: 10 <= i_2.
   (* Else *)
@@ -212,10 +220,12 @@ Assume {
   Have: 10 <= i_1.
   (* Loop assigns ... *)
   Have: ((s.F1_S_i) = 0) /\ ((Init_s_0.Init_F1_S_i)=true) /\
-      (forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 9) -> ((v_2[i_6]=true) ->
-       (a[i_6]=true))))) /\
       (forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 9) ->
-       (((i_6 <= 0) \/ (5 <= i_6)) -> ((s.F1_S_a)[i_6] = v_3[i_6]))))).
+       (((i_6 <= 0) \/ (5 <= i_6)) -> ((a[i_6]=true) <-> (v_2[i_6]=true)))))) /\
+      (forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 9) ->
+       (((i_6 <= 0) \/ (5 <= i_6)) -> ((s.F1_S_a)[i_6] = v_3[i_6]))))) /\
+      (forall i_6 : Z. ((0 < i_6) -> ((0 <= i_6) -> ((i_6 <= 4) ->
+       ((i_6 <= 9) -> ((v_2[i_6]=true) -> (a[i_6]=true))))))).
   (* Else *)
   Have: 10 <= i_2.
   (* Else *)
@@ -238,6 +248,7 @@ Prove: (v[4 <- v_1][i]=true).
 
 Goal Check (file tests/wp_acsl/assigned_initialized_memvar.i, line 54):
 Let a = Init_s_0.Init_F1_S_a.
+Let m = v_2[4 <- v_3].
 Let a_1 = Init_s_1.Init_F1_S_a.
 Assume {
   Have: 0 <= i.
@@ -253,10 +264,12 @@ Assume {
   Have: 10 <= i_1.
   (* Loop assigns ... *)
   Have: ((s.F1_S_i) = 0) /\ ((Init_s_1.Init_F1_S_i)=true) /\
-      (forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 9) -> ((v[i_7]=true) ->
-       (a_1[i_7]=true))))) /\
       (forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 9) ->
-       (((i_7 <= 0) \/ (5 <= i_7)) -> ((s.F1_S_a)[i_7] = v_1[i_7]))))).
+       (((i_7 <= 0) \/ (5 <= i_7)) -> ((a_1[i_7]=true) <-> (v[i_7]=true)))))) /\
+      (forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 9) ->
+       (((i_7 <= 0) \/ (5 <= i_7)) -> ((s.F1_S_a)[i_7] = v_1[i_7]))))) /\
+      (forall i_7 : Z. ((0 < i_7) -> ((0 <= i_7) -> ((i_7 <= 4) ->
+       ((i_7 <= 9) -> ((v[i_7]=true) -> (a_1[i_7]=true))))))).
   (* Else *)
   Have: 10 <= i_2.
   (* Else *)
@@ -274,11 +287,13 @@ Assume {
   Have: 10 <= i_5.
   (* Loop assigns ... *)
   Have: ((Init_s_0.Init_F1_S_i)=true) /\
-      (forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 9) ->
-       ((v_2[4 <- v_3][i_7]=true) -> (a[i_7]=true))))) /\
+      (forall i_7 : Z. ((i_7 != 0) -> ((i_7 != 2) -> ((i_7 != 4) ->
+       ((0 <= i_7) -> ((i_7 <= 9) -> ((a[i_7]=true) <-> (m[i_7]=true)))))))) /\
       (forall i_7 : Z. ((i_7 != 0) -> ((i_7 != 2) -> ((i_7 != 4) ->
        ((0 <= i_7) -> ((i_7 <= 9) ->
-       ((s_1.F1_S_a)[i_7] = v_4[4 <- v_5][i_7]))))))).
+       ((s_1.F1_S_a)[i_7] = v_4[4 <- v_5][i_7]))))))) /\
+      (forall i_7 : Z. ((0 <= i_7) -> ((i_7 <= 9) -> ((m[i_7]=true) ->
+       (((i_7 = 0) \/ (i_7 = 2) \/ (i_7 = 4)) -> (a[i_7]=true)))))).
   (* Else *)
   Have: 10 <= i_6.
 }
@@ -287,7 +302,9 @@ Prove: (a[i]=true).
 ------------------------------------------------------------
 
 Goal Check 'SMOKE' (file tests/wp_acsl/assigned_initialized_memvar.i, line 55):
-Let a = Init_s_0.Init_F1_S_a.
+Let a = Init_s_1.Init_F1_S_a.
+Let m = v_2[4 <- v_3].
+Let a_1 = Init_s_0.Init_F1_S_a.
 Assume {
   Type: is_sint32(i) /\ is_sint32(i_1) /\ is_sint32(i_2) /\ is_sint32(i_3) /\
       is_sint32(i_4) /\ is_sint32(i_5).
@@ -300,16 +317,18 @@ Assume {
   Have: 10 <= i.
   (* Loop assigns ... *)
   Have: ((s.F1_S_i) = 0) /\ ((Init_s_0.Init_F1_S_i)=true) /\
-      (forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 9) -> ((v[i_6]=true) ->
-       (a[i_6]=true))))) /\
       (forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 9) ->
-       (((i_6 <= 0) \/ (5 <= i_6)) -> ((s.F1_S_a)[i_6] = v_1[i_6]))))).
+       (((i_6 <= 0) \/ (5 <= i_6)) -> ((a_1[i_6]=true) <-> (v[i_6]=true)))))) /\
+      (forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 9) ->
+       (((i_6 <= 0) \/ (5 <= i_6)) -> ((s.F1_S_a)[i_6] = v_1[i_6]))))) /\
+      (forall i_6 : Z. ((0 < i_6) -> ((0 <= i_6) -> ((i_6 <= 4) ->
+       ((i_6 <= 9) -> ((v[i_6]=true) -> (a_1[i_6]=true))))))).
   (* Else *)
   Have: 10 <= i_1.
   (* Else *)
   Have: 10 <= i_2.
   (* Loop assigns ... *)
-  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 9) -> ((a[i_6]=true) ->
+  Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 9) -> ((a_1[i_6]=true) ->
       (v_2[i_6]=true)))).
   (* Invariant *)
   Have: (0 <= i_3) /\ (i_3 <= 10).
@@ -321,11 +340,13 @@ Assume {
   Have: 10 <= i_4.
   (* Loop assigns ... *)
   Have: ((Init_s_1.Init_F1_S_i)=true) /\
-      (forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 9) ->
-       ((v_2[4 <- v_3][i_6]=true) -> ((Init_s_1.Init_F1_S_a)[i_6]=true))))) /\
+      (forall i_6 : Z. ((i_6 != 0) -> ((i_6 != 2) -> ((i_6 != 4) ->
+       ((0 <= i_6) -> ((i_6 <= 9) -> ((a[i_6]=true) <-> (m[i_6]=true)))))))) /\
       (forall i_6 : Z. ((i_6 != 0) -> ((i_6 != 2) -> ((i_6 != 4) ->
        ((0 <= i_6) -> ((i_6 <= 9) ->
-       ((s_1.F1_S_a)[i_6] = v_4[4 <- v_5][i_6]))))))).
+       ((s_1.F1_S_a)[i_6] = v_4[4 <- v_5][i_6]))))))) /\
+      (forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 9) -> ((m[i_6]=true) ->
+       (((i_6 = 0) \/ (i_6 = 2) \/ (i_6 = 4)) -> (a[i_6]=true)))))).
   (* Else *)
   Have: 10 <= i_5.
 }
@@ -377,7 +398,9 @@ Prove: true.
 
 Goal Loop assigns (file tests/wp_acsl/assigned_initialized_memvar.i, line 49) (2/5):
 Effect at line 50
-Let a = Init_s_0.Init_F1_S_a.
+Let a = Init_s_1.Init_F1_S_a.
+Let m = v_2[4 <- v_3].
+Let a_1 = Init_s_0.Init_F1_S_a.
 Assume {
   Type: is_sint32(i_2) /\ is_sint32(i_3) /\ is_sint32(i_4) /\
       is_sint32(i_5) /\ is_sint32(i_6) /\ is_sint32(i_7).
@@ -393,16 +416,18 @@ Assume {
   Have: 10 <= i_2.
   (* Loop assigns ... *)
   Have: ((s.F1_S_i) = 0) /\ ((Init_s_0.Init_F1_S_i)=true) /\
-      (forall i_9 : Z. ((0 <= i_9) -> ((i_9 <= 9) -> ((v[i_9]=true) ->
-       (a[i_9]=true))))) /\
       (forall i_9 : Z. ((0 <= i_9) -> ((i_9 <= 9) ->
-       (((i_9 <= 0) \/ (5 <= i_9)) -> ((s.F1_S_a)[i_9] = v_1[i_9]))))).
+       (((i_9 <= 0) \/ (5 <= i_9)) -> ((a_1[i_9]=true) <-> (v[i_9]=true)))))) /\
+      (forall i_9 : Z. ((0 <= i_9) -> ((i_9 <= 9) ->
+       (((i_9 <= 0) \/ (5 <= i_9)) -> ((s.F1_S_a)[i_9] = v_1[i_9]))))) /\
+      (forall i_9 : Z. ((0 < i_9) -> ((0 <= i_9) -> ((i_9 <= 4) ->
+       ((i_9 <= 9) -> ((v[i_9]=true) -> (a_1[i_9]=true))))))).
   (* Else *)
   Have: 10 <= i_3.
   (* Else *)
   Have: 10 <= i_4.
   (* Loop assigns ... *)
-  Have: forall i_9 : Z. ((0 <= i_9) -> ((i_9 <= 9) -> ((a[i_9]=true) ->
+  Have: forall i_9 : Z. ((0 <= i_9) -> ((i_9 <= 9) -> ((a_1[i_9]=true) ->
       (v_2[i_9]=true)))).
   (* Invariant *)
   Have: (0 <= i_5) /\ (i_5 <= 10).
@@ -414,11 +439,13 @@ Assume {
   Have: 10 <= i_6.
   (* Loop assigns ... *)
   Have: ((Init_s_1.Init_F1_S_i)=true) /\
-      (forall i_9 : Z. ((0 <= i_9) -> ((i_9 <= 9) ->
-       ((v_2[4 <- v_3][i_9]=true) -> ((Init_s_1.Init_F1_S_a)[i_9]=true))))) /\
+      (forall i_9 : Z. ((i_9 != 0) -> ((i_9 != 2) -> ((i_9 != 4) ->
+       ((0 <= i_9) -> ((i_9 <= 9) -> ((a[i_9]=true) <-> (m[i_9]=true)))))))) /\
       (forall i_9 : Z. ((i_9 != 0) -> ((i_9 != 2) -> ((i_9 != 4) ->
        ((0 <= i_9) -> ((i_9 <= 9) ->
-       ((s_1.F1_S_a)[i_9] = v_4[4 <- v_5][i_9]))))))).
+       ((s_1.F1_S_a)[i_9] = v_4[4 <- v_5][i_9]))))))) /\
+      (forall i_9 : Z. ((0 <= i_9) -> ((i_9 <= 9) -> ((m[i_9]=true) ->
+       (((i_9 = 0) \/ (i_9 = 2) \/ (i_9 = 4)) -> (a[i_9]=true)))))).
   (* Then *)
   Have: i_7 <= 9.
 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memtyped.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memtyped.res.oracle
index 8d8c5b5b37c..290341bb670 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memtyped.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memtyped.res.oracle
@@ -4,7 +4,6 @@
 [wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 32 goals scheduled
-[wp] Warning: creating session directory `/home/allanb/Documents/Frama-C/branches/feature/blanchard/wp/initialized/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memtyped.0.session'
 [wp] [Alt-Ergo] Goal typed_main_loop_invariant_preserved : Valid
 [wp] [Qed] Goal typed_main_loop_invariant_established : Valid
 [wp] [Alt-Ergo] Goal typed_main_loop_invariant_2_preserved : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/0bca5f490c163f9a2d1bc5be85a938cb.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/0bca5f490c163f9a2d1bc5be85a938cb.json
index 81296a4df59..ea3a6ca498d 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/0bca5f490c163f9a2d1bc5be85a938cb.json
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/0bca5f490c163f9a2d1bc5be85a938cb.json
@@ -1,2 +1,2 @@
-{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0044,
+{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0065,
   "steps": 13 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/0ea068d1821f3b958beb619aabd2bf71.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/0ea068d1821f3b958beb619aabd2bf71.json
deleted file mode 100644
index 27cea6ffc6d..00000000000
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/0ea068d1821f3b958beb619aabd2bf71.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0051,
-  "steps": 47 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/26f2bec626edf9f3b21ce506a0dbc878.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/26f2bec626edf9f3b21ce506a0dbc878.json
deleted file mode 100644
index 6d1863edc63..00000000000
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/26f2bec626edf9f3b21ce506a0dbc878.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0074,
-  "steps": 27 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/2ff76ae8947b7c9d0efda0d01090aeec.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/2ff76ae8947b7c9d0efda0d01090aeec.json
new file mode 100644
index 00000000000..5b4e2cd3379
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/2ff76ae8947b7c9d0efda0d01090aeec.json
@@ -0,0 +1,2 @@
+{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0107,
+  "steps": 27 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/32c205ac1281122e19bed393f47b07af.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/32c205ac1281122e19bed393f47b07af.json
new file mode 100644
index 00000000000..d542926cdcc
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/32c205ac1281122e19bed393f47b07af.json
@@ -0,0 +1,2 @@
+{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.008,
+  "steps": 29 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/47fdc2d6da39295871208bb185768ba9.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/47fdc2d6da39295871208bb185768ba9.json
deleted file mode 100644
index 119359e0f31..00000000000
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/47fdc2d6da39295871208bb185768ba9.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0023,
-  "steps": 18 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/5829cd050c6e5edf4241b52cfb347dbc.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/5829cd050c6e5edf4241b52cfb347dbc.json
deleted file mode 100644
index bab04bc361e..00000000000
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/5829cd050c6e5edf4241b52cfb347dbc.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0094,
-  "steps": 39 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/7790b93ea943473c622f27192935dc0e.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/7790b93ea943473c622f27192935dc0e.json
new file mode 100644
index 00000000000..91964651c8d
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/7790b93ea943473c622f27192935dc0e.json
@@ -0,0 +1,2 @@
+{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0227,
+  "steps": 94 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/81f6bbec14f78ded8be06b4d83acbdca.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/81f6bbec14f78ded8be06b4d83acbdca.json
deleted file mode 100644
index 53ba6839db5..00000000000
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/81f6bbec14f78ded8be06b4d83acbdca.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0057,
-  "steps": 21 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/9fc719583241f8c265dc2b57924b4e5c.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/9fc719583241f8c265dc2b57924b4e5c.json
new file mode 100644
index 00000000000..a445667f615
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/9fc719583241f8c265dc2b57924b4e5c.json
@@ -0,0 +1,2 @@
+{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0091,
+  "steps": 42 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/ad4c4ee63d285e19bebf51be10f2d5da.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/ad4c4ee63d285e19bebf51be10f2d5da.json
index 81d5e9d2f02..c5053a8333f 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/ad4c4ee63d285e19bebf51be10f2d5da.json
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/ad4c4ee63d285e19bebf51be10f2d5da.json
@@ -1,2 +1,2 @@
-{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0066,
+{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0072,
   "steps": 18 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/c17ff689fb984c1d15fced512cddb9f0.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/c17ff689fb984c1d15fced512cddb9f0.json
deleted file mode 100644
index 0e6c81c0a50..00000000000
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/c17ff689fb984c1d15fced512cddb9f0.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0082,
-  "steps": 25 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/532fc8247c18cc12fc05c6dca37a85df.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/ed2046f443d594d7a695098d6732bd53.json
similarity index 100%
rename from src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/532fc8247c18cc12fc05c6dca37a85df.json
rename to src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/ed2046f443d594d7a695098d6732bd53.json
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/f65786f87e448872f8395e84331fc2fa.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/f65786f87e448872f8395e84331fc2fa.json
new file mode 100644
index 00000000000..94e34ea6e49
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/f65786f87e448872f8395e84331fc2fa.json
@@ -0,0 +1,2 @@
+{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0077,
+  "steps": 33 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/f6db810f4dc379e72d7a04df0c9b64f5.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/f6db810f4dc379e72d7a04df0c9b64f5.json
index 4f004cd73a5..0f8cdb45879 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/f6db810f4dc379e72d7a04df0c9b64f5.json
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/f6db810f4dc379e72d7a04df0c9b64f5.json
@@ -1,2 +1,2 @@
-{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0048,
+{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0046,
   "steps": 11 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/f84e2f80d92f69c9bae45d521a10486b.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/f84e2f80d92f69c9bae45d521a10486b.json
new file mode 100644
index 00000000000..152e6b163fb
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/f84e2f80d92f69c9bae45d521a10486b.json
@@ -0,0 +1,2 @@
+{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0018,
+  "steps": 21 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/fbb170335579f1933320c49f3fd8f1ca.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/fbb170335579f1933320c49f3fd8f1ca.json
deleted file mode 100644
index 9059ef12849..00000000000
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/fbb170335579f1933320c49f3fd8f1ca.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0081,
-  "steps": 20 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/fe9862be590507dedbd24e64a535ac03.json b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/fe9862be590507dedbd24e64a535ac03.json
new file mode 100644
index 00000000000..c4f419fb791
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session/cache/fe9862be590507dedbd24e64a535ac03.json
@@ -0,0 +1,2 @@
+{ "prover": "Alt-Ergo:2.0.0", "verdict": "valid", "time": 0.0087,
+  "steps": 39 }
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.res.oracle
index 1e4969d23d8..5184840f613 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.res.oracle
@@ -4,7 +4,6 @@
 [wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 25 goals scheduled
-[wp] Warning: creating session directory `/home/allanb/Documents/Frama-C/branches/feature/blanchard/wp/initialized/src/plugins/wp/tests/wp_acsl/oracle_qualif/assigned_initialized_memvar.0.session'
 [wp] [Alt-Ergo] Goal typed_main_loop_invariant_preserved : Valid
 [wp] [Qed] Goal typed_main_loop_invariant_established : Valid
 [wp] [Alt-Ergo] Goal typed_main_loop_invariant_2_preserved : Valid
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memtyped.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memtyped.res.oracle
index 003c83000b9..b27ea93eec7 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memtyped.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memtyped.res.oracle
@@ -4,7 +4,6 @@
 [wp] Loading driver 'share/wp.driver'
 [wp] Warning: Missing RTE guards
 [wp] 23 goals scheduled
-[wp] Warning: creating session directory `/home/allanb/Documents/Frama-C/branches/feature/blanchard/wp/initialized/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memtyped.0.session'
 [wp] [Alt-Ergo] Goal typed_test_check_unknown : Unsuccess
 [wp] [Alt-Ergo] Goal typed_test_check_unknown_2 : Unsuccess
 [wp] [Alt-Ergo] Goal typed_test_check_unknown_3 : Unsuccess
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memvar.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memvar.res.oracle
index 1f5d08de549..ea40fb15e88 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memvar.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memvar.res.oracle
@@ -7,7 +7,6 @@
 [wp] [Qed] Goal typed_globals_check_qed_ok : Valid
 [wp] [Qed] Goal typed_globals_check_qed_ok_2 : Valid
 [wp] [Qed] Goal typed_globals_check_qed_ok_3 : Valid
-[wp] Warning: creating session directory `/home/allanb/Documents/Frama-C/branches/feature/blanchard/wp/initialized/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_memvar.0.session'
 [wp] [Alt-Ergo] Goal typed_globals_check_qed_ko : Unsuccess
 [wp] [Qed] Goal typed_globals_check_qed_ok_4 : Valid
 [wp] [Alt-Ergo] Goal typed_globals_check_qed_ko_2 : Unsuccess
-- 
GitLab