From 459b31178aa584623d57beb1e9cf38b0e07d2eff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Thu, 26 Sep 2024 14:42:49 +0200
Subject: [PATCH] [Eva] Creates domain log_category in functor
 Domain_builder.Complete.

---
 doc/eva/main.tex                              | 12 ++++----
 src/plugins/eva/domains/abstract_domain.ml    |  2 +-
 src/plugins/eva/domains/apron/apron_domain.ml | 29 ++++++++++---------
 src/plugins/eva/domains/domain_builder.ml     |  8 ++---
 src/plugins/eva/domains/domain_builder.mli    |  2 ++
 .../eva/domains/equality/equality_domain.ml   |  4 ---
 .../eva/domains/gauges/gauges_domain.ml       |  4 ---
 src/plugins/eva/domains/inout_domain.ml       |  2 --
 .../eva/domains/multidim/multidim_domain.ml   |  4 ---
 src/plugins/eva/domains/octagons.ml           |  2 --
 src/plugins/eva/domains/offsm_domain.ml       |  4 ---
 src/plugins/eva/domains/simple_memory.ml      |  2 --
 src/plugins/eva/domains/symbolic_locs.ml      |  4 ---
 src/plugins/eva/domains/taint_domain.ml       |  4 ---
 src/plugins/eva/domains/traces_domain.ml      |  2 --
 src/plugins/eva/domains/unit_domain.ml        |  3 --
 tests/value/symbolic_locs.i                   |  6 ++--
 17 files changed, 32 insertions(+), 62 deletions(-)

diff --git a/doc/eva/main.tex b/doc/eva/main.tex
index 1ac09840397..58ff1fbd0b1 100644
--- a/doc/eva/main.tex
+++ b/doc/eva/main.tex
@@ -4228,7 +4228,7 @@ Most domains are also presented in more details in the following subsections.
     Useful on most analyses and very efficient.
     \tabularnewline
     \midrule
-    symbolic-locations & d-symblocs & \ref{sec:reuse} &
+    symbolic-locations & d-symbolic-locations & \ref{sec:reuse} &
     Infers values at symbolic locations. \\
     Useful on most analyses and very efficient.
     \tabularnewline
@@ -4256,13 +4256,13 @@ Most domains are also presented in more details in the following subsections.
     Infers the sign of variables. Rarely useful.
     \tabularnewline
     \midrule
-    apron-box & \multirow{5}{*}{d-apron} & \multirow{5}{*}{\ref{sec:apron}} &
+    apron-box & d-apron-box & \multirow{5}{*}{\ref{sec:apron}} &
     \multirow{5}{7.5cm}{Experimental and often costly. \\
       Binding to the Apron library domains.}\tabularnewline
-    apron-octagon &  &  & \tabularnewline
-    apron-polka-equality &  &  & \tabularnewline
-    apron-polka-loose &  &  & \tabularnewline
-    apron-polka-strict &  &  & \tabularnewline
+    apron-octagon & d-apron-octagon &  & \tabularnewline
+    apron-polka-equality & d-apron-polka-equality &  & \tabularnewline
+    apron-polka-loose & d-apron-polka-loose &  & \tabularnewline
+    apron-polka-strict & d-apron-polka-strict &  & \tabularnewline
     \midrule
     taint & d-taint & \ref{sec:taint} &
     Experimental. Performs a taint analysis.
diff --git a/src/plugins/eva/domains/abstract_domain.ml b/src/plugins/eva/domains/abstract_domain.ml
index 79e3f38dfd2..2e5d59d8a5c 100644
--- a/src/plugins/eva/domains/abstract_domain.ml
+++ b/src/plugins/eva/domains/abstract_domain.ml
@@ -498,7 +498,7 @@ module type S = sig
   include Reuse with type t := t
 
   (** Category for the messages about the domain.
-      Must be created through {!Self.register_category}. *)
+      Created by {!Domain_builder.Complete} using the domain name. *)
   val log_category : Self.category
 
   (** This function is called after the analysis. The argument is the state
diff --git a/src/plugins/eva/domains/apron/apron_domain.ml b/src/plugins/eva/domains/apron/apron_domain.ml
index a8628869f24..4546f28956b 100644
--- a/src/plugins/eva/domains/apron/apron_domain.ml
+++ b/src/plugins/eva/domains/apron/apron_domain.ml
@@ -24,8 +24,6 @@ open Eval
 open Eva_ast
 open Apron
 
-let dkey = Self.register_category "d-apron"
-
 let debug = false
 
 let abort exclog =
@@ -347,6 +345,7 @@ let ival_to_interval = function
 module type Input = sig
   type t
   val manager: t Manager.t
+  val name: string
 end
 
 module Make (Man : Input) = struct
@@ -360,7 +359,6 @@ module Make (Man : Input) = struct
   let location_dependencies = Main_locations.ploc
 
   let man = Man.manager
-  let log_category = dkey
 
   let empty_env = Environment.make [||] [||]
 
@@ -371,7 +369,7 @@ module Make (Man : Input) = struct
     struct
       include Datatype.Undefined
       type t = state
-      let name = Manager.get_library Man.manager
+      let name = Man.name
       let reprs = [top]
       let structural_descr = Structural_descr.t_unknown
 
@@ -689,44 +687,49 @@ end
 module Apron_Octagon = struct
   type t = Oct.t
   let manager = Oct.manager_alloc ()
+  let name = "apron-octagon"
 end
 
 module Apron_Box = struct
   type t = Box.t
   let manager = Box.manager_alloc ()
+  let name = "apron-box"
 end
 
 module Apron_Polka_Loose = struct
   type t = Polka.loose Polka.t
   let manager = Polka.manager_alloc_loose ()
+  let name = "apron-polka-loose"
 end
 module Apron_Polka_Strict = struct
   type t = Polka.strict Polka.t
   let manager = Polka.manager_alloc_strict ()
+  let name = "apron-polka-strict"
 end
 module Apron_Polka_Equalities = struct
   type t = Polka.equalities Polka.t
   let manager = Polka.manager_alloc_equalities ()
+  let name = "apron-polka-equality"
 end
 
 (** Apron manager allocation changes the rounding mode. *)
 let () = Floating_point.set_round_nearest_even ()
 
-let make name (module Man: Input) =
+let make (module Man: Input) =
   let module Domain = Make (Man) in
-  let name = "apron-" ^ name and experimental = true and priority = 1 in
+  let experimental = true and priority = 1 in
   let descr =
-    "Binding to the " ^ name ^ " domain of the Apron library. " ^
+    "Binding to the " ^ Man.name ^ " domain of the Apron library. " ^
     "See http://apron.cri.ensmp.fr/library for more details."
   in
-  Abstractions.Domain.register ~name ~descr ~experimental ~priority
+  Abstractions.Domain.register ~name:Man.name ~descr ~experimental ~priority
     (module Domain)
 
-let octagon = make "octagon" (module Apron_Octagon)
-let box = make "box" (module Apron_Box)
-let polka_loose = make "polka-loose" (module Apron_Polka_Loose)
-let polka_strict = make "polka-strict" (module Apron_Polka_Strict)
-let polka_equality = make "polka-equality" (module Apron_Polka_Equalities)
+let octagon = make (module Apron_Octagon)
+let box = make (module Apron_Box)
+let polka_loose = make (module Apron_Polka_Loose)
+let polka_strict = make (module Apron_Polka_Strict)
+let polka_equality = make (module Apron_Polka_Equalities)
 
 (* When the value abstraction contains both a cvalue and an interval
    component (coming currently from an Apron domain), reduce them from each
diff --git a/src/plugins/eva/domains/domain_builder.ml b/src/plugins/eva/domains/domain_builder.ml
index eff6e6bf4f0..4df72ddebb9 100644
--- a/src/plugins/eva/domains/domain_builder.ml
+++ b/src/plugins/eva/domains/domain_builder.ml
@@ -66,6 +66,8 @@ module type LeafDomain = sig
 
   module Store: Domain_store.S with type t := t
 
+  val log_category: Self.category
+
   val key: t Abstract_domain.key
 end
 
@@ -97,6 +99,8 @@ module Complete (Domain: InputDomain) = struct
 
   module Store = Domain_store.Make (Domain)
 
+  let log_category = Self.register_category ("d-" ^ Domain.name)
+
   let key: Domain.t Structure.Key_Domain.key =
     Structure.Key_Domain.create_key Domain.name
 end
@@ -125,8 +129,6 @@ module Make_Minimal
 
   include Domain
 
-  let log_category = Self.register_category ("d-" ^ name)
-
   type value = Value.t
   type location = Location.location
   type state = Domain.t
@@ -240,8 +242,6 @@ module Complete_Simple_Cvalue (Domain: Simpler_domains.Simple_Cvalue)
          (Domain) (struct let module_name = Domain.name end)
        : Datatype.S_with_collections with type t := t)
 
-    let log_category = Self.register_category ("d-" ^ name)
-
     type value = Cvalue.V.t
     type location = Precise_locs.precise_location
     type state = Domain.t
diff --git a/src/plugins/eva/domains/domain_builder.mli b/src/plugins/eva/domains/domain_builder.mli
index b7d44a0cf73..c44cb7fab8c 100644
--- a/src/plugins/eva/domains/domain_builder.mli
+++ b/src/plugins/eva/domains/domain_builder.mli
@@ -70,6 +70,8 @@ module type LeafDomain = sig
 
   module Store: Domain_store.S with type t := t
 
+  val log_category: Self.category
+
   val key: t Abstract_domain.key
 end
 
diff --git a/src/plugins/eva/domains/equality/equality_domain.ml b/src/plugins/eva/domains/equality/equality_domain.ml
index 78c7105fe3e..c087751c8ee 100644
--- a/src/plugins/eva/domains/equality/equality_domain.ml
+++ b/src/plugins/eva/domains/equality/equality_domain.ml
@@ -38,8 +38,6 @@ let call_init_state kf =
   | "none" -> ISEmpty
   | _ -> assert false
 
-let dkey = Self.register_category "d-equality"
-
 open Hcexprs
 
 (* ------------------------- Dependences ------------------------------------ *)
@@ -122,8 +120,6 @@ module Internal = struct
 
   let name = "equality"
 
-  let log_category = dkey
-
   let pretty fmt (eqs, _, _) = Equality.Set.pretty fmt eqs
 
   let _pretty_debug fmt (eqs, deps, modified) =
diff --git a/src/plugins/eva/domains/gauges/gauges_domain.ml b/src/plugins/eva/domains/gauges/gauges_domain.ml
index 49416c570c0..29e4391cb7e 100644
--- a/src/plugins/eva/domains/gauges/gauges_domain.ml
+++ b/src/plugins/eva/domains/gauges/gauges_domain.ml
@@ -1107,8 +1107,6 @@ module G = struct
 
 end
 
-let dkey = Self.register_category "d-gauges"
-
 module D : Abstract_domain.Leaf
   with type state = G.t
    and type value = Cvalue.V.t
@@ -1125,8 +1123,6 @@ module D : Abstract_domain.Leaf
   include G
   include Domain_builder.Complete (struct include G let top = empty end)
 
-  let log_category = dkey
-
   let empty _ = G.empty
 
   let pretty = G.pretty
diff --git a/src/plugins/eva/domains/inout_domain.ml b/src/plugins/eva/domains/inout_domain.ml
index 0b2f3dd185b..409ddb4ac0a 100644
--- a/src/plugins/eva/domains/inout_domain.ml
+++ b/src/plugins/eva/domains/inout_domain.ml
@@ -221,8 +221,6 @@ module Domain = struct
 
   include Domain_builder.Complete (LatticeInout)
 
-  let log_category = Self.register_category "d-inout"
-
   let enter_scope _kind _vars state = state
   let leave_scope _kf vars state = Transfer.remove_variables vars state
 
diff --git a/src/plugins/eva/domains/multidim/multidim_domain.ml b/src/plugins/eva/domains/multidim/multidim_domain.ml
index ed430145d4c..574830344de 100644
--- a/src/plugins/eva/domains/multidim/multidim_domain.ml
+++ b/src/plugins/eva/domains/multidim/multidim_domain.ml
@@ -23,8 +23,6 @@
 open Eval
 open Lattice_bounds
 
-let dkey = Self.register_category "d-multidim"
-
 let map_to_singleton map =
   let aux base offset = function
     | None -> Some (base, offset)
@@ -377,8 +375,6 @@ struct
   type mdlocation = Location.t (* should be = to location *)
   type origin
 
-  let log_category = dkey
-
   let cache_name s =
     Hptmap_sig.PersistentCache ("Multidim_domain." ^ s)
 
diff --git a/src/plugins/eva/domains/octagons.ml b/src/plugins/eva/domains/octagons.ml
index e4a757b1b39..2d213923304 100644
--- a/src/plugins/eva/domains/octagons.ml
+++ b/src/plugins/eva/domains/octagons.ml
@@ -1177,8 +1177,6 @@ module State = struct
           Format.fprintf fmt "@[%a@]" Octagons.pretty octagons
       end)
 
-  let log_category = Self.register_category "d-octagon"
-
   let pretty_debug fmt { octagons; intervals; relations; deps } =
     Format.fprintf fmt
       "@[<v> Octagons: %a@; Intervals: %a@; Relations: %a@; Dependencies: %a@.]"
diff --git a/src/plugins/eva/domains/offsm_domain.ml b/src/plugins/eva/domains/offsm_domain.ml
index 4c5051422b7..e5c70d01a2d 100644
--- a/src/plugins/eva/domains/offsm_domain.ml
+++ b/src/plugins/eva/domains/offsm_domain.ml
@@ -30,8 +30,6 @@ let store_redundant = false
     unsoundnesses in the domain through testing, because many more expressions
     end up being handled. *)
 
-let dkey = Self.register_category "d-bitwise"
-
 module Default_offsetmap = struct
   open Cvalue
 
@@ -111,8 +109,6 @@ module D : Abstract_domain.Leaf
 
   include Domain_builder.Complete (Memory)
 
-  let log_category = dkey
-
   let empty _ = Memory.empty_map
 
   let enter_scope _kind _vars state = state (* default is Top, nothing to do *)
diff --git a/src/plugins/eva/domains/simple_memory.ml b/src/plugins/eva/domains/simple_memory.ml
index b935f55c6a9..e3aa413b1c7 100644
--- a/src/plugins/eva/domains/simple_memory.ml
+++ b/src/plugins/eva/domains/simple_memory.ml
@@ -196,8 +196,6 @@ module Make_Domain (Info: sig val name: string end) (Value: Value) = struct
   let value_dependencies = Abstract_value.Leaf (module Value)
   let location_dependencies = Main_locations.ploc
 
-  let log_category = Self.register_category ("d-" ^ Info.name)
-
   let widen _kf _stmt = widen
 
   (* This function returns the information known about the location
diff --git a/src/plugins/eva/domains/symbolic_locs.ml b/src/plugins/eva/domains/symbolic_locs.ml
index b7e3cf5ecc7..2dcedc78349 100644
--- a/src/plugins/eva/domains/symbolic_locs.ml
+++ b/src/plugins/eva/domains/symbolic_locs.ml
@@ -24,8 +24,6 @@ open Eval
 open Eva_ast
 open Locations
 
-let dkey = Self.register_category "d-symblocs"
-
 module K = Hcexprs
 module V = Cvalue.V (* TODO: functorize (with locations too ?) *)
 
@@ -470,8 +468,6 @@ module D : Abstract_domain.Leaf
 
   include Domain_builder.Complete (Memory)
 
-  let log_category = dkey
-
   let empty _ = Memory.empty_map
 
   let enter_scope _kind _vars state = state
diff --git a/src/plugins/eva/domains/taint_domain.ml b/src/plugins/eva/domains/taint_domain.ml
index bb9a3ed3a24..5721c9a5ae7 100644
--- a/src/plugins/eva/domains/taint_domain.ml
+++ b/src/plugins/eva/domains/taint_domain.ml
@@ -41,8 +41,6 @@ type taint_state = {
   dependent_call: bool;
 }
 
-let dkey = Self.register_category "d-taint"
-
 (* Debug key to also include [assume_stmts] in the output of the
    Frama_C_domain_show_each directive. *)
 let dkey_debug = Self.register_category "d-taint-debug"
@@ -316,8 +314,6 @@ module Domain = struct
             and type location := location
             and type origin := origin)
 
-  let log_category = dkey
-
 
   (* Logic. *)
 
diff --git a/src/plugins/eva/domains/traces_domain.ml b/src/plugins/eva/domains/traces_domain.ml
index b6de18a2a56..1c7fbf5cef2 100644
--- a/src/plugins/eva/domains/traces_domain.ml
+++ b/src/plugins/eva/domains/traces_domain.ml
@@ -1103,8 +1103,6 @@ module D = struct
 
   include Domain_builder.Complete (Traces)
 
-  let log_category = Self.register_category "d-traces"
-
   let assign ki lv e _v _valuation state =
     let cil_lval = Eva_ast.to_cil_lval lv.Eval.lval in
     let cil_exp = Eva_ast.to_cil_exp e in
diff --git a/src/plugins/eva/domains/unit_domain.ml b/src/plugins/eva/domains/unit_domain.ml
index caba1937bd9..ee1b2625f7a 100644
--- a/src/plugins/eva/domains/unit_domain.ml
+++ b/src/plugins/eva/domains/unit_domain.ml
@@ -20,15 +20,12 @@
 (*                                                                        *)
 (**************************************************************************)
 
-let log_key = Self.register_category "unit-domain"
-
 module Static = struct
   module D = struct
     include Datatype.Unit
     type state = t
 
     let name = "unit"
-    let log_category = log_key
     let structure = Abstract.Domain.Unit
 
     let top = ()
diff --git a/tests/value/symbolic_locs.i b/tests/value/symbolic_locs.i
index 88195506235..4c6aae5ee2e 100644
--- a/tests/value/symbolic_locs.i
+++ b/tests/value/symbolic_locs.i
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: +"-eva-domains symbolic-locations -eva-msg-key d-symblocs"
+   STDOPT: +"-eva-domains symbolic-locations -eva-msg-key d-symbolic-locations"
 */
 
 volatile int v;
@@ -9,10 +9,10 @@ void main1() {
   unsigned int i = v;
   int k = v;
 
-  t[i] = 3; 
+  t[i] = 3;
   t[i] = t[i]+1; // The equality domain loses information here
   u[k] = t[i] + 2; Frama_C_dump_each();
-  int j = t[i] + u[k]; 
+  int j = t[i] + u[k];
 
   int *p = &t[i]; Frama_C_dump_each();
   int q = *p+1; // Does not write without adding something here, because otherwise we do a copy...
-- 
GitLab