From d44331ff653aa250eb8dc2730c23543a5be89b78 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Tue, 11 Jul 2023 20:08:17 +0200
Subject: [PATCH] [Eva] Uses the evaluation engine on Cvalue instead of
 Db.Value.

---
 src/plugins/eva/domains/cvalue/builtins_misc.ml  | 13 +++++++++----
 src/plugins/eva/domains/cvalue/builtins_split.ml |  2 +-
 src/plugins/eva/utils/widen.ml                   |  2 +-
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/plugins/eva/domains/cvalue/builtins_misc.ml b/src/plugins/eva/domains/cvalue/builtins_misc.ml
index 93fbcf970dc..47d8da9c980 100644
--- a/src/plugins/eva/domains/cvalue/builtins_misc.ml
+++ b/src/plugins/eva/domains/cvalue/builtins_misc.ml
@@ -22,6 +22,7 @@
 
 open Eva_utils
 
+open Lattice_bounds.Bottom.Operators
 
 let frama_C_assert state actuals =
   let do_bottom () =
@@ -35,10 +36,14 @@ let frama_C_assert state actuals =
       then do_bottom ()
       else if Cvalue.V.contains_zero arg
       then begin
-        let state = !Db.Value.reduce_by_cond state arg_exp true in
-        if Cvalue.Model.is_reachable state
-        then (warning_once_current "Frama_C_assert: unknown"; state)
-        else do_bottom ()
+        let state =
+          let* valuation = fst (Cvalue_queries.reduce state arg_exp true) in
+          let valuation = Cvalue_queries.to_domain_valuation valuation in
+          Cvalue_transfer.update valuation state
+        in
+        match state with
+        | `Value state -> warning_once_current "Frama_C_assert: unknown"; state
+        | `Bottom -> do_bottom ()
       end
       else begin
         warning_once_current "Frama_C_assert: true";
diff --git a/src/plugins/eva/domains/cvalue/builtins_split.ml b/src/plugins/eva/domains/cvalue/builtins_split.ml
index 5d6721b188a..a6a2cf2812a 100644
--- a/src/plugins/eva/domains/cvalue/builtins_split.ml
+++ b/src/plugins/eva/domains/cvalue/builtins_split.ml
@@ -74,7 +74,7 @@ let warning warn s =
    [max_card] elements. *)
 let split_v ~warn lv state max_card =
   if Cil.isArithmeticOrPointerType (Cil.typeOfLval lv) then
-    let loc = !Db.Value.lval_to_loc_state state lv in
+    let loc = Cvalue_queries.lval_to_loc state lv in
     if Locations.Location_Bits.cardinal_zero_or_one loc.Locations.loc then
       let v_indet = Cvalue.Model.find_indeterminate state loc in
       let v = Cvalue.V_Or_Uninitialized.get_v v_indet in
diff --git a/src/plugins/eva/utils/widen.ml b/src/plugins/eva/utils/widen.ml
index 2e4564b4ef0..b26bb71371f 100644
--- a/src/plugins/eva/utils/widen.ml
+++ b/src/plugins/eva/utils/widen.ml
@@ -499,7 +499,7 @@ module Parsed_Dynamic_Hints =
 let dynamic_bases_of_lval states e offset =
   let lv = (Mem e, offset) in
   List.fold_left (fun acc' state ->
-      let location = !Db.Value.lval_to_loc_state state lv in
+      let location = Cvalue_queries.lval_to_loc state lv in
       Locations.Location_Bits.fold_bases
         (fun base acc'' -> Base.Hptset.add base acc'')
         location.Locations.loc acc'
-- 
GitLab