From 18cd9ce3b7f478639031b2af3dcb99ff687ae3e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr> Date: Fri, 18 Mar 2022 17:27:24 +0100 Subject: [PATCH] [Eva] Multidim: registers a hook to access other domain states in the join. --- Makefile | 2 +- src/plugins/value/domains/multidim_domain.ml | 43 +++++++++++++++++++ src/plugins/value/domains/multidim_domain.mli | 2 + src/plugins/value/engine/abstractions.ml | 6 --- src/plugins/value/engine/abstractions.mli | 1 - 5 files changed, 46 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 10816b72815..8d1f4aeae6d 100644 --- a/Makefile +++ b/Makefile @@ -881,7 +881,6 @@ PLUGIN_CMO:= partitioning/split_strategy domains/domain_mode self parameters \ domains/hcexprs \ domains/equality/equality domains/equality/equality_domain \ domains/offsm_domain \ - domains/multidim_domain \ domains/symbolic_locs \ domains/sign_domain \ domains/cvalue/warn domains/cvalue/locals_scoping \ @@ -906,6 +905,7 @@ PLUGIN_CMO:= partitioning/split_strategy domains/domain_mode self parameters \ engine/transfer_logic engine/transfer_stmt engine/transfer_specification \ engine/mem_exec engine/iterator engine/initialization \ engine/compute_functions engine/analysis register \ + domains/multidim_domain \ domains/taint_domain \ $(APRON_CMO) $(NUMERORS_CMO) \ utils/eva_results \ diff --git a/src/plugins/value/domains/multidim_domain.ml b/src/plugins/value/domains/multidim_domain.ml index 86d3850c471..9ebd380bd81 100644 --- a/src/plugins/value/domains/multidim_domain.ml +++ b/src/plugins/value/domains/multidim_domain.ml @@ -849,3 +849,46 @@ struct end include Domain + +let multidim_top = top +let better_join _oracle_left _oracle_right a b = join a b + +let multidim_hook (module Abstract: Abstractions.S) : (module Abstractions.S) = + match Abstract.Dom.get key with + | None -> (module Abstract) + | Some get_multidim -> + let module Eval = + Evaluation.Make (Abstract.Val) (Abstract.Loc) (Abstract.Dom) + in + let module Dom = struct + include Abstract.Dom + + let join a b = + let r = join (set key multidim_top a) (set key multidim_top b) in + let left_oracle = Eval.evaluate a in + let right_oracle = Eval.evaluate b in + let taint = + better_join left_oracle right_oracle (get_multidim a) (get_multidim b) + in + set key taint r + end + in + (module struct + module Val = Abstract.Val + module Loc = Abstract.Loc + module Dom = Dom + end) + +(* Registers the domain. *) +let flag = + let name = "multidim" + and descr = "Improve the precision over arrays of structures \ + or multidimensional arrays." + and experimental = true + and abstraction = + Abstractions.{ values = Single (module Main_values.CVal); + domain = Domain (module Domain); } + in + Abstractions.register ~name ~descr ~experimental abstraction + +let () = Abstractions.register_hook multidim_hook diff --git a/src/plugins/value/domains/multidim_domain.mli b/src/plugins/value/domains/multidim_domain.mli index 3a451e5b12d..a9d0279ec7b 100644 --- a/src/plugins/value/domains/multidim_domain.mli +++ b/src/plugins/value/domains/multidim_domain.mli @@ -23,3 +23,5 @@ include Abstract_domain.Leaf with type value = Cvalue.V.t and type location = Precise_locs.precise_location + +val flag: Abstractions.flag diff --git a/src/plugins/value/engine/abstractions.ml b/src/plugins/value/engine/abstractions.ml index 573e734b218..fedceb3f36f 100644 --- a/src/plugins/value/engine/abstractions.ml +++ b/src/plugins/value/engine/abstractions.ml @@ -174,12 +174,6 @@ module Config = struct to a statement." (module Traces_domain.D) - let multidim = - make 2 "multidim" ~experimental:true - "Improve the precision over arrays of structures or multidimensional \ - arrays." - (module Multidim_domain) - let printer = make 2 "printer" "Debug domain, only useful for developers. Prints the transfer functions \ diff --git a/src/plugins/value/engine/abstractions.mli b/src/plugins/value/engine/abstractions.mli index 4f761517c0d..c8f03be0c01 100644 --- a/src/plugins/value/engine/abstractions.mli +++ b/src/plugins/value/engine/abstractions.mli @@ -158,7 +158,6 @@ module Config : sig val inout: flag val sign: flag val traces: flag - val multidim: flag val printer: flag val default: t -- GitLab