From 691a9d59a6c2451fa58447f4db406205ec41d33b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Fri, 25 Sep 2020 15:00:41 +0200
Subject: [PATCH] [Eva] In abstract values, adds a new function [replace_base].

This function substitutes variables in pointer values.
---
 src/plugins/value/values/abstract_value.mli         | 3 +++
 src/plugins/value/values/main_values.ml             | 3 +++
 src/plugins/value/values/numerors/numerors_value.ml | 1 +
 src/plugins/value/values/offsm_value.ml             | 5 +++++
 src/plugins/value/values/sign_value.ml              | 2 ++
 src/plugins/value/values/value_product.ml           | 4 ++++
 6 files changed, 18 insertions(+)

diff --git a/src/plugins/value/values/abstract_value.mli b/src/plugins/value/values/abstract_value.mli
index 05e465434ff..ac8ddecc5dc 100644
--- a/src/plugins/value/values/abstract_value.mli
+++ b/src/plugins/value/values/abstract_value.mli
@@ -182,12 +182,15 @@ module type S = sig
     dst_val: t ->
     t option or_bottom
 
+  (** {3 Misc } *)
+
   val resolve_functions : t -> Kernel_function.t list or_top * bool
   (** [resolve_functions v] returns the list of functions that may be pointed to
       by the abstract value [v] (representing a function pointer). The returned
       boolean must be [true] if some of the values represented by [v] do not
       correspond to functions. It is always safe to return [`Top, true]. *)
 
+  val replace_base: Base.substitution -> t -> t
 end
 
 type 'v key = 'v Structure.Key_Value.key
diff --git a/src/plugins/value/values/main_values.ml b/src/plugins/value/values/main_values.ml
index b21f868739e..b38d4fcaf3a 100644
--- a/src/plugins/value/values/main_values.ml
+++ b/src/plugins/value/values/main_values.ml
@@ -132,6 +132,8 @@ module CVal = struct
       let kfs, alarm = Locations.Location_Bytes.fold_topset_ok aux v init in
       `Value kfs, alarm
     with Abstract_interp.Error_Top -> `Top, true
+
+  let replace_base substitution t = snd (Cvalue.V.replace_base substitution t)
 end
 
 module Interval = struct
@@ -175,6 +177,7 @@ module Interval = struct
   let forward_cast ~src_type:_ ~dst_type:_ _ = `Value top
 
   let resolve_functions _ = `Top, true
+  let replace_base _substitution t = t
 
   let rewrap_integer range value =
     match value with
diff --git a/src/plugins/value/values/numerors/numerors_value.ml b/src/plugins/value/values/numerors/numerors_value.ml
index 2832d06cb35..5381969a55f 100644
--- a/src/plugins/value/values/numerors/numerors_value.ml
+++ b/src/plugins/value/values/numerors/numerors_value.ml
@@ -318,6 +318,7 @@ let assume_comparable _cmp v1 v2 = `Unknown (v1, v2)
 let rewrap_integer _ _ = top
 let backward_cast ~src_typ:_ ~dst_typ:_ ~src_val:_ ~dst_val:_ = `Value None
 let resolve_functions _ = `Top, true
+let replace_base _substitution t = t
 
 
 (*-----------------------------------------------------------------------------
diff --git a/src/plugins/value/values/offsm_value.ml b/src/plugins/value/values/offsm_value.ml
index b46b11002e8..f6fd8d3fd66 100644
--- a/src/plugins/value/values/offsm_value.ml
+++ b/src/plugins/value/values/offsm_value.ml
@@ -434,6 +434,11 @@ module Offsm : Abstract_value.Leaf with type t = offsm_or_top = struct
     else Top
 
   let resolve_functions _ = `Top, true (* TODO: extract value *)
+  let replace_base substitution = function
+    | Top -> Top
+    | O offsm ->
+      let f v = snd (Cvalue.V_Or_Uninitialized.replace_base substitution v) in
+      O (Cvalue.V_Offsetmap.map_on_values f offsm)
 
   let forward_unop _typ op o =
     let o' = match o, op with
diff --git a/src/plugins/value/values/sign_value.ml b/src/plugins/value/values/sign_value.ml
index b9f59f90e27..08334941537 100644
--- a/src/plugins/value/values/sign_value.ml
+++ b/src/plugins/value/values/sign_value.ml
@@ -107,6 +107,8 @@ let constant _ = function
    precisely *)
 let resolve_functions _ = `Top, true
 
+let replace_base _substitution t = t
+
 (** {2 Alarms} *)
 
 let assume_non_zero v =
diff --git a/src/plugins/value/values/value_product.ml b/src/plugins/value/values/value_product.ml
index 7e89f1fc751..03ec02d71f2 100644
--- a/src/plugins/value/values/value_product.ml
+++ b/src/plugins/value/values/value_product.ml
@@ -125,6 +125,10 @@ module Make
     in
     list, b1 && b2
 
+  let replace_base substitution (left, right) =
+    Left.replace_base substitution left,
+    Right.replace_base substitution right
+
   let reduce (orig_left, orig_right) left right = match left, right with
     | None, None            -> None
     | Some left, None       -> Some (left, orig_right)
-- 
GitLab