From 12c3a8bb2fa9df3c01decce12a0d95b201e52bbb Mon Sep 17 00:00:00 2001 From: Valentin Perrelle <valentin.perrelle@cea.fr> Date: Fri, 17 Sep 2021 17:22:04 +0200 Subject: [PATCH] [Eva] api: Implements equalities extraction --- src/plugins/value/utils/results.ml | 25 +++++++++++++++++++++++-- src/plugins/value/utils/results.mli | 2 +- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/plugins/value/utils/results.ml b/src/plugins/value/utils/results.ml index c74ee12715f..2ee26e12af1 100644 --- a/src/plugins/value/utils/results.ml +++ b/src/plugins/value/utils/results.ml @@ -254,8 +254,29 @@ struct let callstacks req = Response.callstacks (get_by_callstack req) - let equality_class _exp _req = - raise Not_implemented (* Where is the key for Equality_domain ? *) + let equality_class exp req = + let open Equality in + match A.Dom.get Equality_domain.key with + | None -> + Result.error DisabledDomain + | Some extract -> + let hce = Hcexprs.HCE.of_exp exp in + let extract' state = + let equalities = Equality_domain.project (extract state) in + NonTrivial (Set.find hce equalities) + and reduce e1 e2 = + match e1, e2 with + | Trivial, _ | _, Trivial -> Trivial + | NonTrivial e1, NonTrivial e2 -> Equality.inter e1 e2 + in + let r = match Response.map_join extract' reduce (get req) with + | (`Top | `Bottom) as r -> r + | `Value Trivial -> `Top + | `Value (NonTrivial e) -> + let l = Equality.elements e in + `Value (List.map Hcexprs.HCE.to_exp l) + in + convert r let as_cvalue_model req = match A.Dom.get Cvalue_domain.State.key with diff --git a/src/plugins/value/utils/results.mli b/src/plugins/value/utils/results.mli index b70dd4a4bcc..50b1505f08d 100644 --- a/src/plugins/value/utils/results.mli +++ b/src/plugins/value/utils/results.mli @@ -57,7 +57,7 @@ val filter_callstack : (callstack -> bool) -> request -> request (* State requests *) val callstacks : request -> callstack list -val equality_class : Cil_types.exp -> request -> Cil_types.exp list option +val equality_class : Cil_types.exp -> request -> Cil_types.exp list result val as_cvalue_model : request -> Cvalue.Model.t result (* Evaluation *) -- GitLab