From e52eea9fced0a00d7551b931a34d204a1f1cb925 Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Fri, 10 Apr 2020 09:40:31 +0200
Subject: [PATCH] [wp] Assigned do not considers formal and globals

---
 src/plugins/wp/MemVar.ml | 86 +++++++++++++++++++---------------------
 1 file changed, 40 insertions(+), 46 deletions(-)

diff --git a/src/plugins/wp/MemVar.ml b/src/plugins/wp/MemVar.ml
index e82c635975b..18b4f8959f7 100644
--- a/src/plugins/wp/MemVar.ml
+++ b/src/plugins/wp/MemVar.ml
@@ -736,26 +736,18 @@ struct
         Set( v2 , update v1 ofs v )
     | _ -> failwith "MemVar stored on a non MemVar location"
 
-  let memvar_set_init seq l v =
-    match l with
-    | Ref x -> noref ~op:"write to" x
-    | Val((CREF|CVAL),x,ofs) ->
-        let v1 = get_init_term seq.pre x in
-        let v2 = get_init_term seq.post x in
-        Set( v2 , update_init v1 ofs v )
-    | _ -> failwith "MemVar initialize on a non MemVar location"
-
+  let memvar_set_init seq x ofs v =
+    if x.vformal || x.vglob then []
+    else
+      let v1 = get_init_term seq.pre x in
+      let v2 = get_init_term seq.post x in
+      [ Set( v2 , update_init v1 ofs v ) ]
 
   let stored seq obj l v = match l with
     | Ref x -> noref ~op:"write to" x
-    | Val((CREF|CVAL),x,_) ->
-        let init =
-          if not (x.vformal || x.vglob) then
-            [ memvar_set_init seq l (Cvalues.initialized_obj obj) ]
-          else
-            []
-        in
-        (memvar_stored seq obj l v) :: init
+    | Val((CREF|CVAL),x,ofs) ->
+        let init = Cvalues.initialized_obj obj in
+        (memvar_stored seq obj l v) :: (memvar_set_init seq x ofs init)
     | Val((CTXT|CARR|HEAP) as m,x,ofs) ->
         M.stored (mseq_of_seq seq) obj (mloc_of_path m x ofs) v
     | Loc l ->
@@ -1259,40 +1251,42 @@ struct
   (* -------------------------------------------------------------------------- *)
 
   let rec monotonic_initialized seq obj x ofs =
-    match obj with
-    | C_int _ | C_float _ | C_pointer _ ->
-        p_imply
-          (p_bool (access_init (get_init_term seq.pre x) ofs))
-          (p_bool (access_init (get_init_term seq.post x) ofs))
-    | C_array { arr_flat=flat ; arr_element=t } ->
-        let size = match flat with
-          | 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)
-    | C_comp ci ->
-        let mk_pred f =
-          let obj = Ctypes.object_of f.ftype in
-          let ofs = ofs @ [Field f] in
-          monotonic_initialized seq obj x ofs
-        in
-        Lang.F.p_conj (List.map mk_pred ci.cfields)
+    if x.vformal || x.vglob then p_true
+    else
+      match obj with
+      | C_int _ | C_float _ | C_pointer _ ->
+          p_imply
+            (p_bool (access_init (get_init_term seq.pre x) ofs))
+            (p_bool (access_init (get_init_term seq.post x) ofs))
+      | C_array { arr_flat=flat ; arr_element=t } ->
+          let size = match flat with
+            | 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)
+      | C_comp ci ->
+          let mk_pred f =
+            let obj = Ctypes.object_of f.ftype in
+            let ofs = ofs @ [Field f] in
+            monotonic_initialized seq obj x ofs
+          in
+          Lang.F.p_conj (List.map mk_pred ci.cfields)
 
   let memvar_assigned seq obj loc v =
     match loc with
     | Ref x -> noref ~op:"write to" x
     | Val((CREF|CVAL),x,ofs) ->
         let init = e_var (Lang.freshvar ~basename:"v" (init_of_object obj)) in
-        (memvar_set_init seq loc init) ::
+        (memvar_stored seq obj loc v) ::
         Assert(monotonic_initialized seq obj x ofs) ::
-        [ memvar_stored seq obj loc v ]
+        (memvar_set_init seq x ofs init)
     | _ -> failwith "MemVar assigned on a non MemVar location"
 
   let assigned_loc seq obj = function
@@ -1339,8 +1333,8 @@ struct
         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
-        (memvar_set_init seq (Val(m,x,[])) init) ::
         Assert(monotonic_initialized seq obj_x x []) ::
+        (memvar_set_init seq x [] init) @
         (assigned_genset seq [k] m x ofs p)
 
   let assigned_descr seq obj xs l p =
@@ -1353,8 +1347,8 @@ struct
     | 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
-        (memvar_set_init seq (Val(m,x,[])) init) ::
         Assert(monotonic_initialized seq obj_x x []) ::
+        (memvar_set_init seq x [] init) @
         (assigned_genset seq xs m x ofs p)
 
   let assigned seq obj = function
-- 
GitLab