From e3d5e4579cd2ba2570499ce3f17c85164f84c62b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Tue, 19 Jul 2022 09:47:29 +0200
Subject: [PATCH] [Eva] Logic_inout: exports function [verify_assigns] in
 Eva.mli.

Used by the from plugin when option -from-verify-assigns is enabled.
---
 src/plugins/eva/Eva.mli                | 10 ++++++++++
 src/plugins/eva/dune                   |  2 +-
 src/plugins/eva/legacy/logic_inout.ml  |  6 ++----
 src/plugins/eva/legacy/logic_inout.mli | 10 +++++++++-
 src/plugins/eva/register.ml            |  2 ++
 5 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/src/plugins/eva/Eva.mli b/src/plugins/eva/Eva.mli
index 1c07614bd1a..1d48b8bd770 100644
--- a/src/plugins/eva/Eva.mli
+++ b/src/plugins/eva/Eva.mli
@@ -608,6 +608,16 @@ module Cvalue_callbacks: sig
 
 end
 
+module Logic_inout: sig
+
+  (** Evaluate the assigns clauses of the given function in its given pre-state,
+      and compare them with the given froms (computed by the from plugin).
+      Emits warnings if needed, and sets statuses to the assigns clauses. *)
+  val verify_assigns:
+    Cil_types.kernel_function -> pre:Cvalue.Model.t -> Function_Froms.froms -> unit
+
+end
+
 module Eval_terms: sig
 
   (** [annot_predicate_deps ~pre ~here p] computes the logic dependencies needed
diff --git a/src/plugins/eva/dune b/src/plugins/eva/dune
index 502fec6d6ed..6a91dd3bcb3 100644
--- a/src/plugins/eva/dune
+++ b/src/plugins/eva/dune
@@ -99,6 +99,6 @@
   gen-api.sh Eva.header
   engine/analysis.mli utils/results.mli parameters.mli
   utils/eva_annotations.mli eval.mli domains/cvalue/builtins.mli
-  utils/cvalue_callbacks.mli legacy/eval_terms.mli utils/eva_results.mli
+  utils/cvalue_callbacks.mli legacy/logic_inout.mli legacy/eval_terms.mli utils/eva_results.mli
   utils/unit_tests.mli)
  (action (run %{deps})))
diff --git a/src/plugins/eva/legacy/logic_inout.ml b/src/plugins/eva/legacy/logic_inout.ml
index aebbdbd39bc..64edb349ce7 100644
--- a/src/plugins/eva/legacy/logic_inout.ml
+++ b/src/plugins/eva/legacy/logic_inout.ml
@@ -176,7 +176,7 @@ let check_fct_assigns kf ab ~pre_state found_froms =
          List.iter2 check_from assigns_deps assigns_zones)
   in List.iter check_for_behavior behaviors
 
-let verify_assigns_from kf ~pre froms =
+let verify_assigns kf ~pre froms =
   let funspec = Annotations.funspec kf in
   let env = Eval_terms.env_pre_f ~pre () in
   let eval_predicate pred =
@@ -186,6 +186,4 @@ let verify_assigns_from kf ~pre froms =
     | Eval_terms.Unknown -> Alarmset.Unknown
   in
   let ab = Active_behaviors.create eval_predicate funspec in
-  check_fct_assigns kf ab ~pre_state:pre froms;;
-
-Db.Value.verify_assigns_froms := verify_assigns_from;;
+  check_fct_assigns kf ab ~pre_state:pre froms
diff --git a/src/plugins/eva/legacy/logic_inout.mli b/src/plugins/eva/legacy/logic_inout.mli
index 7af69cb1ef9..f29202c96c7 100644
--- a/src/plugins/eva/legacy/logic_inout.mli
+++ b/src/plugins/eva/legacy/logic_inout.mli
@@ -20,4 +20,12 @@
 (*                                                                        *)
 (**************************************************************************)
 
-(** No function exported. Registers Db.Value.verify_assigns_from. *)
+[@@@ api_start]
+
+(** Evaluate the assigns clauses of the given function in its given pre-state,
+    and compare them with the given froms (computed by the from plugin).
+    Emits warnings if needed, and sets statuses to the assigns clauses. *)
+val verify_assigns:
+  Cil_types.kernel_function -> pre:Cvalue.Model.t -> Function_Froms.froms -> unit
+
+[@@@ api_end]
diff --git a/src/plugins/eva/register.ml b/src/plugins/eva/register.ml
index e48168230e4..d216a3abb25 100644
--- a/src/plugins/eva/register.ml
+++ b/src/plugins/eva/register.ml
@@ -505,6 +505,8 @@ let register (module Eval: Eval) (module Export: Export) =
 
 let () = Db.Value.initial_state_only_globals := Analysis.cvalue_initial_state
 
+let () = Db.Value.verify_assigns_froms := Logic_inout.verify_assigns
+
 let () =
   let eval = (module Eval : Eval) in
   let export = (module Export ((val eval : Eval)) : Export) in
-- 
GitLab