From 3c4a12ee3fd95535111ce6f75169ca99d89c0c62 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Fri, 21 Feb 2020 09:01:42 +0100
Subject: [PATCH] [Eva] In abstract domains, removes [introduce_globals] and
 changes [enter_scope].

---
 src/plugins/value/domains/abstract_domain.mli | 30 +++++++-----
 .../value/domains/apron/apron_domain.ml       | 18 ++-----
 .../value/domains/cvalue/cvalue_domain.ml     | 49 ++++++++++---------
 src/plugins/value/domains/domain_builder.ml   |  4 +-
 src/plugins/value/domains/domain_lift.ml      |  2 -
 src/plugins/value/domains/domain_product.ml   |  6 +--
 .../value/domains/equality/equality_domain.ml |  3 +-
 .../value/domains/gauges/gauges_domain.ml     |  3 +-
 src/plugins/value/domains/inout_domain.ml     |  3 +-
 src/plugins/value/domains/octagons.ml         |  3 +-
 src/plugins/value/domains/offsm_domain.ml     |  3 +-
 src/plugins/value/domains/printer_domain.ml   |  6 +--
 src/plugins/value/domains/simple_memory.ml    |  3 +-
 src/plugins/value/domains/simpler_domains.mli |  6 +--
 src/plugins/value/domains/symbolic_locs.ml    |  3 +-
 src/plugins/value/domains/traces_domain.ml    | 22 +++++----
 src/plugins/value/domains/unit_domain.ml      |  1 -
 src/plugins/value/engine/initialization.ml    |  8 +--
 src/plugins/value/engine/iterator.ml          |  9 ++--
 .../value/engine/transfer_specification.ml    |  3 +-
 src/plugins/value/engine/transfer_stmt.ml     |  3 +-
 21 files changed, 89 insertions(+), 99 deletions(-)

diff --git a/src/plugins/value/domains/abstract_domain.mli b/src/plugins/value/domains/abstract_domain.mli
index 8a05da16558..2de5aebaf49 100644
--- a/src/plugins/value/domains/abstract_domain.mli
+++ b/src/plugins/value/domains/abstract_domain.mli
@@ -272,6 +272,11 @@ type 'state logic_environment = {
   result: varinfo option;
 }
 
+type variable_kind =
+  | Global
+  | Formal of kernel_function
+  | Local of kernel_function
+
 (** Value for the initialization of variables. Can be either zero or top. *)
 type init_value = Zero | Top
 
@@ -374,12 +379,20 @@ module type S = sig
   (** {3 Miscellaneous } *)
 
   (** Scoping: abstract transformers for entering and exiting blocks.
-      [kf] is the englobing function, and the variables of the list [vars]
-      should be added or removed from the abstract state here.
-      Note that the formals of a function enter the scope through the transfer
-      function {!Transfer.start_call}, but leave it through a
-      call to {!leave_scope}. *)
-  val enter_scope: kernel_function -> varinfo list -> t -> t
+      The variables should be added or removed from the abstract state here.
+      Note that the formals of a function called enter the scope through the
+      transfer function {!start_call}, but leave it through a call to
+      {!leave_scope}. *)
+
+  (** Introduces a list of variables in the state. At this point, the variables
+      are uninitialized. Globals and formals of the 'main' will be initialized
+      by {!initialize_variable} and {!initialize_variable_using_type}. Local
+      variables remain uninitialized until an assignment through {!assign}.
+      The formal parameters of a call enter the scope through {!start_call}. *)
+  val enter_scope: variable_kind -> varinfo list -> t -> t
+
+  (** Removes a list of local and formal variables from the state.
+      The first argument is the englobing function. *)
   val leave_scope: kernel_function -> varinfo list -> t -> t
 
   val enter_loop: stmt -> state -> state
@@ -391,11 +404,6 @@ module type S = sig
   (** The initial state with which the analysis start. *)
   val empty: unit -> t
 
-  (** Introduces the list of global variables in the state.  At this point,
-      these variables are uninitialized: they will be initialized through the
-      two functions below.*)
-  val introduce_globals: varinfo list -> t -> t
-
   (** [initialize_variable lval loc ~initialized init_value state] initializes
       the value of the location [loc] of lvalue [lval] in [state] with:
       – bits 0 if init_value = Zero;
diff --git a/src/plugins/value/domains/apron/apron_domain.ml b/src/plugins/value/domains/apron/apron_domain.ml
index 09ecaf05ded..72ce9a088e3 100644
--- a/src/plugins/value/domains/apron/apron_domain.ml
+++ b/src/plugins/value/domains/apron/apron_domain.ml
@@ -679,24 +679,12 @@ module Make (Man : Input) = struct
 
   let empty () = top
 
-  let introduce_globals vars state = enter_scope vars state
-
-  let enter_scope _kf vars state = enter_scope vars state
+  let enter_scope _kind vars state = enter_scope vars state
 
   let initialize_variable _lval _loc ~initialized:_ _init_value state = state
 
-  let initialize_variable_using_type _kind varinfo state =
-    try
-      let var = translate_varinfo varinfo in
-      let env = Abstract1.env state in
-      if Environment.mem_var env var
-      then state
-      else
-        let env = Environment.add env [|var|] [||] in
-        let state = Abstract1.change_environment man state env false in
-        constraint_to_typ env state [(var, varinfo)]
-    with
-    | Out_of_Scope _ -> state
+  (* TODO: use constraint_to_type? *)
+  let initialize_variable_using_type _kind _varinfo state =  state
 
   let relate _ _ _ = Base.SetLattice.top
   let filter _ _ _ state = state
diff --git a/src/plugins/value/domains/cvalue/cvalue_domain.ml b/src/plugins/value/domains/cvalue/cvalue_domain.ml
index 13142d74dcb..3ff88aca356 100644
--- a/src/plugins/value/domains/cvalue/cvalue_domain.ml
+++ b/src/plugins/value/domains/cvalue/cvalue_domain.ml
@@ -322,15 +322,6 @@ module State = struct
   (*                             Initialization                               *)
   (* ------------------------------------------------------------------------ *)
 
-  let introduce_globals vars (state, clob) =
-    let introduce state varinfo =
-      let base = Base.of_varinfo varinfo in
-      let loc = Locations.loc_of_base base in
-      let value = Cvalue.V_Or_Uninitialized.uninitialized in
-      Model.add_indeterminate_binding ~exact:true state loc value
-    in
-    List.fold_left introduce state vars, clob
-
   let initialize_variable  _lval loc ~initialized init_value (state, clob) =
     let value = match init_value with
       | Abstract_domain.Top  -> Cvalue.V.top_int
@@ -383,21 +374,33 @@ module State = struct
   (*                                  Misc                                    *)
   (* ------------------------------------------------------------------------ *)
 
-  let enter_scope _kf vars (state, clob) =
-    let bind_local state vi =
-      let b = Base.of_varinfo vi in
-      let offsm =
-        if Value_parameters.InitializedLocals.get () then
-          let v = Cvalue.(V_Or_Uninitialized.initialized V.top_int) in
-          match Cvalue.V_Offsetmap.size_from_validity (Base.validity b) with
-          | `Bottom -> assert false
-          | `Value size -> Cvalue.V_Offsetmap.create_isotropic ~size v
-        else
-          Bottom.non_bottom (Cvalue.Default_offsetmap.default_offsetmap b)
-      in
-      Model.add_base b offsm state
+  let bind_local state vi =
+    let b = Base.of_varinfo vi in
+    let offsm =
+      if Value_parameters.InitializedLocals.get () then
+        let v = Cvalue.(V_Or_Uninitialized.initialized V.top_int) in
+        match Cvalue.V_Offsetmap.size_from_validity (Base.validity b) with
+        | `Bottom -> assert false
+        | `Value size -> Cvalue.V_Offsetmap.create_isotropic ~size v
+      else
+        Bottom.non_bottom (Cvalue.Default_offsetmap.default_offsetmap b)
+    in
+    Model.add_base b offsm state
+
+  let bind_global state varinfo =
+    let base = Base.of_varinfo varinfo in
+    let loc = Locations.loc_of_base base in
+    let value = Cvalue.V_Or_Uninitialized.uninitialized in
+    Model.add_indeterminate_binding ~exact:true state loc value
+
+  let enter_scope kind vars (state, clob) =
+    let bind =
+      match kind with
+      | Abstract_domain.Local _kf  -> bind_local
+      | Abstract_domain.Formal _kf -> bind_local
+      | Abstract_domain.Global     -> bind_global
     in
-    List.fold_left bind_local state vars, clob
+    List.fold_left bind state vars, clob
 
   let leave_scope kf vars (state, clob) =
     let state = Model.remove_variables vars state in
diff --git a/src/plugins/value/domains/domain_builder.ml b/src/plugins/value/domains/domain_builder.ml
index ae604a6b2b0..ebeab1fb6a2 100644
--- a/src/plugins/value/domains/domain_builder.ml
+++ b/src/plugins/value/domains/domain_builder.ml
@@ -73,7 +73,7 @@ module Make_Minimal
   let extract_expr _oracle _state _expr = top_answer
   let extract_lval _oracle _state _lval _typ _location = top_answer
   let backward_location _state _lval _typ location value = `Value (location, value)
-  let reduce_further _sttae _expr _value = []
+  let reduce_further _state _expr _value = []
 
   let update _valuation state = `Value state
 
@@ -100,7 +100,6 @@ module Make_Minimal
 
   let initialize_variable_using_type _kind varinfo state =
     let lval = Cil.var varinfo in
-    let state = introduce_globals [varinfo] state in
     Domain.initialize_variable lval ~initialized:true Abstract_domain.Top state
 
   let logic_assign _assigns _location ~pre:_ _state = top
@@ -235,7 +234,6 @@ module Complete_Simple_Cvalue (Domain: Simpler_domains.Simple_Cvalue)
 
     let initialize_variable_using_type _kind varinfo state =
       let lval = Cil.var varinfo in
-      let state = introduce_globals [varinfo] state in
       Domain.initialize_variable lval ~initialized:true Abstract_domain.Top state
 
     let logic_assign _assigns _location ~pre:_ _state = top
diff --git a/src/plugins/value/domains/domain_lift.ml b/src/plugins/value/domains/domain_lift.ml
index 4aff7889345..8d264722a10 100644
--- a/src/plugins/value/domains/domain_lift.ml
+++ b/src/plugins/value/domains/domain_lift.ml
@@ -137,11 +137,9 @@ module Make
   let leave_loop = Domain.leave_loop
 
   let empty = Domain.empty
-  let introduce_globals = Domain.introduce_globals
   let initialize_variable lval loc ~initialized init_value state =
     let loc = Convert.restrict_loc loc in
     Domain.initialize_variable lval loc ~initialized init_value state
-
   let initialize_variable_using_type = Domain.initialize_variable_using_type
 
   let relate = Domain.relate
diff --git a/src/plugins/value/domains/domain_product.ml b/src/plugins/value/domains/domain_product.ml
index 5f9d14b4397..5dd265a91b8 100644
--- a/src/plugins/value/domains/domain_product.ml
+++ b/src/plugins/value/domains/domain_product.ml
@@ -256,8 +256,8 @@ module Make
     Right.reduce_by_predicate right_env right pred positive >>-: fun right ->
     left, right
 
-  let enter_scope kf vars (left, right) =
-    Left.enter_scope kf vars left, Right.enter_scope kf vars right
+  let enter_scope kind vars (left, right) =
+    Left.enter_scope kind vars left, Right.enter_scope kind vars right
   let leave_scope kf vars (left, right) =
     Left.leave_scope kf vars left, Right.leave_scope kf vars right
 
@@ -269,8 +269,6 @@ module Make
     Left.leave_loop stmt left, Right.leave_loop stmt right
 
   let empty () = Left.empty (), Right.empty ()
-  let introduce_globals vars (left, right) =
-    Left.introduce_globals vars left, Right.introduce_globals vars right
   let initialize_variable lval loc ~initialized init_value (left, right) =
     Left.initialize_variable lval loc ~initialized init_value left,
     Right.initialize_variable lval loc ~initialized init_value right
diff --git a/src/plugins/value/domains/equality/equality_domain.ml b/src/plugins/value/domains/equality/equality_domain.ml
index 9407df3145a..c6d87d30f88 100644
--- a/src/plugins/value/domains/equality/equality_domain.ml
+++ b/src/plugins/value/domains/equality/equality_domain.ml
@@ -511,7 +511,7 @@ module Make
   let evaluate_predicate _ _ _ = Alarmset.Unknown
   let reduce_by_predicate _ state _ _ = `Value state
 
-  let enter_scope _kf _vars state = state
+  let enter_scope _kind _vars state = state
   let leave_scope _kf vars state = unscope state vars
 
   let enter_loop _ state = state
@@ -519,7 +519,6 @@ module Make
   let leave_loop _ state = state
 
   let empty () = empty
-  let introduce_globals _vars state = state
   let initialize_variable _ _ ~initialized:_ _ state = state
   let initialize_variable_using_type _ _ state  = state
 
diff --git a/src/plugins/value/domains/gauges/gauges_domain.ml b/src/plugins/value/domains/gauges/gauges_domain.ml
index 5c892c9e225..240fedb691b 100644
--- a/src/plugins/value/domains/gauges/gauges_domain.ml
+++ b/src/plugins/value/domains/gauges/gauges_domain.ml
@@ -1141,7 +1141,7 @@ module D_Impl : Abstract_domain.S
 
   let pretty = G.pretty
 
-  let enter_scope _kf _vars state =
+  let enter_scope _kind _vars state =
     state (* default is Top, nothing to do *)
 
   let remove_variables vars (state:state) =
@@ -1292,7 +1292,6 @@ module D_Impl : Abstract_domain.S
   let reuse _kf _bases ~current_input:_ ~previous_output = previous_output
 
   (* Initial state *)
-  let introduce_globals _ state = state
   let initialize_variable_using_type _ _ state = state
   let initialize_variable _ _ ~initialized:_ _ state = state
 
diff --git a/src/plugins/value/domains/inout_domain.ml b/src/plugins/value/domains/inout_domain.ml
index b34535306a3..000941e666b 100644
--- a/src/plugins/value/domains/inout_domain.ml
+++ b/src/plugins/value/domains/inout_domain.ml
@@ -223,7 +223,7 @@ module Internal
   let name = "inout"
   let log_category = Value_parameters.register_category "d-inout"
 
-  let enter_scope _kf _vars state = state
+  let enter_scope _kind _vars state = state
   let leave_scope _kf vars state = Transfer.remove_variables vars state
 
   let to_z valuation lv =
@@ -257,7 +257,6 @@ module Internal
 
   (* Initial state. Initializers are singletons, so we store nothing. *)
   let empty () = LatticeInout.empty
-  let introduce_globals _vars state = state
   let initialize_variable _ _ ~initialized:_ _ state = state
   let initialize_variable_using_type _ _ state  = state
 
diff --git a/src/plugins/value/domains/octagons.ml b/src/plugins/value/domains/octagons.ml
index fae7d982ebc..4249c66e0ef 100644
--- a/src/plugins/value/domains/octagons.ml
+++ b/src/plugins/value/domains/octagons.ml
@@ -1244,7 +1244,7 @@ module Domain = struct
   let evaluate_predicate _env _state _pred = Alarmset.Unknown
   let reduce_by_predicate _env state _pred _positive = `Value state
 
-  let enter_scope _kf _varinfos state = state
+  let enter_scope _kind _varinfos state = state
   let leave_scope _kf varinfos state =
     let state = List.fold_left State.remove state varinfos in
     check "leave_scope" state
@@ -1253,7 +1253,6 @@ module Domain = struct
   let incr_loop_counter _stmt state = state
   let leave_loop _stmt state = state
 
-  let introduce_globals _varinfos state = state
   let initialize_variable _lval _location ~initialized:_ _value state = state
   let initialize_variable_using_type _kind _varinfo state = state
 
diff --git a/src/plugins/value/domains/offsm_domain.ml b/src/plugins/value/domains/offsm_domain.ml
index 2809ade3ffa..c02f00d3972 100644
--- a/src/plugins/value/domains/offsm_domain.ml
+++ b/src/plugins/value/domains/offsm_domain.ml
@@ -109,7 +109,7 @@ module Internal  : Domain_builder.InputDomain
 
   let empty _ = Memory.empty_map
 
-  let enter_scope _kf _vars state = state (* default is Top, nothing to do *)
+  let enter_scope _kind _vars state = state (* default is Top, nothing to do *)
   let leave_scope _kf vars state =
     Memory.remove_variables vars state
 
@@ -212,7 +212,6 @@ module Internal  : Domain_builder.InputDomain
     state
 
   (* Initial state *)
-  let introduce_globals _ state = state
   let initialize_variable_using_type _ _ state = state
   let initialize_variable _ _ ~initialized:_ _ state = state
 
diff --git a/src/plugins/value/domains/printer_domain.ml b/src/plugins/value/domains/printer_domain.ml
index 6e77dfe64e7..84291ad8bce 100644
--- a/src/plugins/value/domains/printer_domain.ml
+++ b/src/plugins/value/domains/printer_domain.ml
@@ -110,17 +110,13 @@ module Simple : Simpler_domains.Simple_Cvalue = struct
     feedback "empty";
     ()
 
-  let introduce_globals vi_list state =
-    feedback "introduce_globals %a" pp_vi_list vi_list;
-    state
-
   let initialize_variable lval ~initialized:_ init state =
     feedback "initialize_variable %a with %a"
       Printer.pp_lval lval
       pp_init_val init;
     state
 
-  let enter_scope _kf vi_list state =
+  let enter_scope _kind vi_list state =
     feedback  "enter_scope %a" pp_vi_list vi_list;
     state
 
diff --git a/src/plugins/value/domains/simple_memory.ml b/src/plugins/value/domains/simple_memory.ml
index 97eed460437..fe8be4136e0 100644
--- a/src/plugins/value/domains/simple_memory.ml
+++ b/src/plugins/value/domains/simple_memory.ml
@@ -293,7 +293,7 @@ module Make_Internal (Info: sig val name: string end) (Value: Value) = struct
       end
     | _ -> ()
 
-  let enter_scope _kf _vars state = state
+  let enter_scope _kind _vars state = state
   let leave_scope _kf vars state = remove_variables vars state
 
   let enter_loop _ state = state
@@ -305,7 +305,6 @@ module Make_Internal (Info: sig val name: string end) (Value: Value) = struct
   let reduce_by_predicate _ state _ _ = `Value state
 
   let empty () = top
-  let introduce_globals _varinfos state = state
   let initialize_variable _lval _location ~initialized:_ _value state = state
   let initialize_variable_using_type _kind _varinfo state = state
 
diff --git a/src/plugins/value/domains/simpler_domains.mli b/src/plugins/value/domains/simpler_domains.mli
index 2b4d654bdde..c8aa69e2c58 100644
--- a/src/plugins/value/domains/simpler_domains.mli
+++ b/src/plugins/value/domains/simpler_domains.mli
@@ -70,11 +70,10 @@ module type Minimal = sig
   (** Initialization of variables. *)
 
   val empty: unit -> t
-  val introduce_globals: varinfo list -> t -> t
   val initialize_variable:
     lval -> initialized:bool -> Abstract_domain.init_value -> t -> t
 
-  val enter_scope: kernel_function -> varinfo list -> t -> t
+  val enter_scope: Abstract_domain.variable_kind -> varinfo list -> t -> t
   val leave_scope: kernel_function -> varinfo list -> t -> t
 
   (** Pretty printers. *)
@@ -138,11 +137,10 @@ module type Simple_Cvalue = sig
   (** Initialization of variables. *)
 
   val empty: unit -> t
-  val introduce_globals: varinfo list -> t -> t
   val initialize_variable:
     lval -> initialized:bool -> Abstract_domain.init_value -> t -> t
 
-  val enter_scope: kernel_function -> varinfo list -> t -> t
+  val enter_scope: Abstract_domain.variable_kind -> varinfo list -> t -> t
   val leave_scope: kernel_function -> varinfo list -> t -> t
 
   (** Pretty printer. *)
diff --git a/src/plugins/value/domains/symbolic_locs.ml b/src/plugins/value/domains/symbolic_locs.ml
index f325e2a7148..98a56ef209d 100644
--- a/src/plugins/value/domains/symbolic_locs.ml
+++ b/src/plugins/value/domains/symbolic_locs.ml
@@ -478,7 +478,7 @@ module Internal : Domain_builder.InputDomain
 
   let empty _ = Memory.empty_map
 
-  let enter_scope _kf _vars state = state
+  let enter_scope _kind _vars state = state
   let leave_scope _kf vars state =
     (* removed variables revert implicitly to Top *)
     Memory.remove_variables vars state
@@ -627,7 +627,6 @@ module Internal : Domain_builder.InputDomain
       keys state
 
   (* Initial state. Initializers are singletons, so we store nothing. *)
-  let introduce_globals _ state = state
   let initialize_variable_using_type _ _ state = state
   let initialize_variable _ _ ~initialized:_ _ state = state
 
diff --git a/src/plugins/value/domains/traces_domain.ml b/src/plugins/value/domains/traces_domain.ml
index 771c2220a59..69dde95e126 100644
--- a/src/plugins/value/domains/traces_domain.ml
+++ b/src/plugins/value/domains/traces_domain.ml
@@ -914,16 +914,9 @@ module Internal = struct
   let reuse _kf _bases ~current_input:_ ~previous_output:state = state
 
   let empty () = Traces.empty
-  let introduce_globals vars state =
-    {state with globals = vars @ state.globals}
   let initialize_variable lv _ ~initialized:_ _ state =
     Traces.add_trans state (Msg(Format.asprintf "initialize variable: %a" Printer.pp_lval lv ))
   let initialize_variable_using_type init_kind varinfo state =
-    let state =
-      match init_kind with
-      | Abstract_domain.Main_Formal -> {state with main_formals = varinfo::state.main_formals}
-      | _ -> state
-    in
     let msg = Format.asprintf "initialize@ variable@ using@ type@ %a@ %a"
         (fun fmt init_kind ->
            match init_kind with
@@ -1000,8 +993,19 @@ module Internal = struct
       Traces.add_trans state (Msg "leave_loop")
 
 
-  let enter_scope kf vars state = Traces.add_trans state (EnterScope (kf, vars))
-  let leave_scope kf vars state = Traces.add_trans state (LeaveScope (kf, vars))
+  let enter_scope kind vars state =
+    match kind with
+    | Abstract_domain.Global ->
+      { state with globals = vars @ state.globals }
+    | Abstract_domain.Formal kf ->
+      if Kernel_function.equal kf (fst (Globals.entry_point ()))
+      then { state with main_formals = vars @ state.main_formals }
+      else state
+    | Abstract_domain.Local kf ->
+      Traces.add_trans state (EnterScope (kf, vars))
+
+  let leave_scope kf vars state =
+    Traces.add_trans state (LeaveScope (kf, vars))
 
   let reduce_further _state _expr _value = [] (*Nothing intelligent to suggest*)
 
diff --git a/src/plugins/value/domains/unit_domain.ml b/src/plugins/value/domains/unit_domain.ml
index 8fd5df76754..cd989453aed 100644
--- a/src/plugins/value/domains/unit_domain.ml
+++ b/src/plugins/value/domains/unit_domain.ml
@@ -79,7 +79,6 @@ module Make
   let leave_loop _ _ = ()
 
   let empty () = ()
-  let introduce_globals _ () = ()
   let initialize_variable _ _ ~initialized:_ _ _ = ()
   let initialize_variable_using_type _ _ _  = ()
 
diff --git a/src/plugins/value/engine/initialization.ml b/src/plugins/value/engine/initialization.ml
index fd124a687b6..7d06a16962e 100644
--- a/src/plugins/value/engine/initialization.ml
+++ b/src/plugins/value/engine/initialization.ml
@@ -264,8 +264,10 @@ module Make
         Value_parameters.abort "Entry point %a has arguments"
           Kernel_function.pretty kf
       else
-        let kind = Abstract_domain.Main_Formal in
-        List.fold_right (Domain.initialize_variable_using_type kind) l state
+        let var_kind = Abstract_domain.Formal kf in
+        let state = Domain.enter_scope var_kind l state in
+        let init_kind = Abstract_domain.Main_Formal in
+        List.fold_right (Domain.initialize_variable_using_type init_kind) l state
 
   (* Use the values supplied in [actuals] for the formals of [kf], and
      bind them in [state] *)
@@ -305,7 +307,7 @@ module Make
 
   let initialize_global_variable ~lib_entry vi init state =
     Cil.CurrentLoc.set vi.vdecl;
-    let state = Domain.introduce_globals [vi] state in
+    let state = Domain.enter_scope Abstract_domain.Global [vi] state in
     if vi.vsource then
       let initialize =
         if lib_entry || (vi.vstorage = Extern)
diff --git a/src/plugins/value/engine/iterator.ml b/src/plugins/value/engine/iterator.ml
index cc122f92ae9..def379b956f 100644
--- a/src/plugins/value/engine/iterator.ml
+++ b/src/plugins/value/engine/iterator.ml
@@ -281,18 +281,20 @@ module Make_Dataflow
   let transfer_instr (stmt : stmt) (instr : instr) : transfer_function =
     match instr with
     | Local_init (vi, AssignInit exp, _loc) ->
+      let kind = Abstract_domain.Local kf in
       let transfer state =
-        let state = Domain.enter_scope kf [vi] state in
+        let state = Domain.enter_scope kind [vi] state in
         Init.initialize_local_variable stmt vi exp state
       in
       lift' transfer
     | Local_init (vi, ConsInit (f, args, k), loc) ->
+      let kind = Abstract_domain.Local kf in
       let as_func dest callee args _loc state =
         (* This variable enters the scope too early, as it should
            be introduced after the call to [f] but before the assignment
            to [v]. This is currently not possible, at least without
            splitting Transfer.call in two. *)
-        let state = Domain.enter_scope kf [vi] state in
+        let state = Domain.enter_scope kind [vi] state in
         transfer_call stmt dest callee args state
       in
       Cil.treat_constructor_as_func as_func vi f args k loc
@@ -335,7 +337,8 @@ module Make_Dataflow
         let return_lval = Var vi_ret, NoOffset in
         let kstmt = Kstmt stmt in
         fun state ->
-          let state = Domain.enter_scope kf [vi_ret] state in
+          let kind = Abstract_domain.Local kf in
+          let state = Domain.enter_scope kind [vi_ret] state in
           let state' = Transfer.assign state kstmt return_lval return_exp in
           Bottom.to_list state'
     in
diff --git a/src/plugins/value/engine/transfer_specification.ml b/src/plugins/value/engine/transfer_specification.ml
index b3be9e6f908..2d62190cc61 100644
--- a/src/plugins/value/engine/transfer_specification.ml
+++ b/src/plugins/value/engine/transfer_specification.ml
@@ -546,7 +546,8 @@ module Make
         | Some retres_vi ->
           (* Notify the user about missing assigns \result. *)
           if warn then warn_on_missing_result_assigns kinstr call.kf spec;
-          let state = Domain.enter_scope call.kf [retres_vi] state in
+          let kind = Abstract_domain.Local call.kf in
+          let state = Domain.enter_scope kind [retres_vi] state in
           let init_kind = Abstract_domain.Spec_Return call.kf  in
           Domain.initialize_variable_using_type init_kind retres_vi state
       in
diff --git a/src/plugins/value/engine/transfer_stmt.ml b/src/plugins/value/engine/transfer_stmt.ml
index d4ccb75c422..3e770b1c5ba 100644
--- a/src/plugins/value/engine/transfer_stmt.ml
+++ b/src/plugins/value/engine/transfer_stmt.ml
@@ -846,7 +846,8 @@ module Make (Abstract: Abstractions.Eva) = struct
   (* Makes the local variables [variables] enter the scope in [state].
      Also initializes volatile variable to top. *)
   let enter_scope kf variables state =
-    let state = Domain.enter_scope kf variables state in
+    let kind = Abstract_domain.Local kf in
+    let state = Domain.enter_scope kind variables state in
     let is_volatile varinfo =
       Cil.typeHasQualifier "volatile" varinfo.vtype
     in
-- 
GitLab