From 6e3b3ad4a68ce17ebad4d86f471ff47d022b7ec9 Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Wed, 21 Apr 2021 16:01:20 +0200
Subject: [PATCH] [wp] Move always_initialized in Cvalues

---
 src/plugins/wp/Cvalues.ml  |  3 +++
 src/plugins/wp/Cvalues.mli |  1 +
 src/plugins/wp/MemTyped.ml |  3 +--
 src/plugins/wp/MemVar.ml   | 18 +++++++++---------
 4 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/src/plugins/wp/Cvalues.ml b/src/plugins/wp/Cvalues.ml
index 5c8b21c9784..d26aee33e7d 100644
--- a/src/plugins/wp/Cvalues.ml
+++ b/src/plugins/wp/Cvalues.ml
@@ -133,6 +133,9 @@ and init_comp_value value ci =
 let initialized_obj = init_value e_true
 let uninitialized_obj = init_value e_false
 
+let always_initialized x =
+  (x.vformal || x.vglob) && not @@ Cil.isStructOrUnionType x.vtype
+
 (* -------------------------------------------------------------------------- *)
 (* --- Length of empty compinfos                                          --- *)
 (* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/Cvalues.mli b/src/plugins/wp/Cvalues.mli
index 01fd0ed8bdf..c9d70fa788f 100644
--- a/src/plugins/wp/Cvalues.mli
+++ b/src/plugins/wp/Cvalues.mli
@@ -99,6 +99,7 @@ val logic_constant : logic_constant -> term
 val constant_exp : exp -> term
 val constant_term : Cil_types.term -> term
 
+val always_initialized: varinfo -> bool
 val initialized_obj: c_object -> term
 val uninitialized_obj: c_object -> term
 
diff --git a/src/plugins/wp/MemTyped.ml b/src/plugins/wp/MemTyped.ml
index 802617a661a..abf67a6cb7c 100644
--- a/src/plugins/wp/MemTyped.ml
+++ b/src/plugins/wp/MemTyped.ml
@@ -579,8 +579,7 @@ module BASE = WpContext.Generator(Varinfo)
 
       let initialization prefix x base =
         match sizeof x with
-        | Some size
-          when (x.vformal || x.vglob) && not(Cil.isStructOrUnionType x.vtype) ->
+        | Some size when Cvalues.always_initialized x ->
             let a = Lang.freshvar ~basename:"init" t_init in
             let m = e_var a in
             let init_access =
diff --git a/src/plugins/wp/MemVar.ml b/src/plugins/wp/MemVar.ml
index c2897b53872..f52667de01c 100644
--- a/src/plugins/wp/MemVar.ml
+++ b/src/plugins/wp/MemVar.ml
@@ -738,9 +738,6 @@ struct
   (* ---  Memory Load                                                       --- *)
   (* -------------------------------------------------------------------------- *)
 
-  let always_init vi =
-    (vi.vglob || vi.vformal) && not @@ Cil.isStructOrUnionType vi.vtype
-
   let rec access_gen kind a = function
     | [] -> a
     | Field f :: ofs -> access_gen kind (e_getfield a (Cfield (f, kind))) ofs
@@ -786,7 +783,7 @@ struct
   let load_init sigma obj = function
     | Ref _ ->
         e_true
-    | Val((CREF|CVAL),x,_) when always_init x ->
+    | Val((CREF|CVAL),x,_) when Cvalues.always_initialized x ->
         Cvalues.initialized_obj obj
     | Val((CREF|CVAL),x,ofs) ->
         access_init (get_init_term sigma x) ofs
@@ -1148,7 +1145,7 @@ struct
           | Val(m,x,p) ->
               if is_heap_allocated m then
                 M.initialized sigma.mem (Rloc(obj,mloc_of_loc l))
-              else if always_init x then
+              else if Cvalues.always_initialized x then
                 try valid_offset RW (vobject m x) p
                 with ShiftMismatch -> shift_mismatch l
               else
@@ -1174,7 +1171,7 @@ struct
                   let p, a, b = normalize elt p in
                   let in_array = valid_range RW (vobject m x) p (elt, a, b) in
                   let initialized =
-                    if always_init x then p_true
+                    if Cvalues.always_initialized x then p_true
                     else initialized_range sigma (vobject m x) x p a b
                   in
                   F.p_imply (F.p_leq a b) (p_and in_array initialized)
@@ -1263,7 +1260,8 @@ struct
     | Leave -> []
     | Enter ->
         let init_status v =
-          if v.vdefined || always_init v || not @@ is_mvar_alloc v then None
+          if v.vdefined || Cvalues.always_initialized v || not@@ is_mvar_alloc v
+          then None
           else
             let i = Cvalues.uninitialized_obj (Ctypes.object_of v.vtype) in
             Some (Lang.F.p_equal (access_init (get_init_term seq.post v) []) i)
@@ -1377,7 +1375,7 @@ struct
   (* -------------------------------------------------------------------------- *)
 
   let rec monotonic_initialized seq obj x ofs =
-    if always_init x then p_true
+    if Cvalues.always_initialized x then p_true
     else
       match obj with
       (* Structure initialization is not monotonic *)
@@ -1611,7 +1609,9 @@ struct
   let domain obj l =
     match l with
     | Ref x | Val((CVAL|CREF),x,_) ->
-        let init = if not @@ always_init x then [ Init x ] else [] in
+        let init =
+          if not @@ Cvalues.always_initialized x then [ Init x ] else []
+        in
         Heap.Set.of_list ((Var x) :: init)
     | Loc _ | Val((CTXT _|CARR _|HEAP),_,_) ->
         M.Heap.Set.fold
-- 
GitLab