From 3c33631bb81ecbd082bb3f6502e26df619c330c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr> Date: Tue, 29 Jun 2021 14:47:47 +0200 Subject: [PATCH] [Eva] In abstract domains, changes the signature of [interpret_acsl_extension]. This function now takes a logical environment, as [evaluate_predicate] and [reduce_by_predicate]. --- src/plugins/value/domains/abstract_domain.mli | 3 ++- src/plugins/value/domains/cvalue/cvalue_domain.ml | 2 +- src/plugins/value/domains/domain_builder.ml | 9 +++++---- src/plugins/value/domains/domain_builder.mli | 3 ++- src/plugins/value/domains/domain_product.ml | 7 ++++--- src/plugins/value/domains/taint_domain.ml | 2 +- src/plugins/value/engine/transfer_logic.ml | 14 +++++++++++--- src/plugins/value/engine/transfer_logic.mli | 3 ++- 8 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/plugins/value/domains/abstract_domain.mli b/src/plugins/value/domains/abstract_domain.mli index 9d3603ad580..dcd64ed8222 100644 --- a/src/plugins/value/domains/abstract_domain.mli +++ b/src/plugins/value/domains/abstract_domain.mli @@ -412,7 +412,8 @@ module type S = sig (** Interprets an ACSL extension. Defined by {!Domain_builder.Complete} as the identity. *) - val interpret_acsl_extension: acsl_extension -> state -> state + val interpret_acsl_extension: + acsl_extension -> state logic_environment -> state -> state (** {3 Scoping and initialization } *) diff --git a/src/plugins/value/domains/cvalue/cvalue_domain.ml b/src/plugins/value/domains/cvalue/cvalue_domain.ml index 22f0af53515..3bc961572d7 100644 --- a/src/plugins/value/domains/cvalue/cvalue_domain.ml +++ b/src/plugins/value/domains/cvalue/cvalue_domain.ml @@ -316,7 +316,7 @@ module State = struct then `Value (state, clob) else `Bottom - let interpret_acsl_extension _extension state = state + let interpret_acsl_extension _extension _env state = state let evaluate_from_clause state deps = (* Evaluates the contents of one element of the from clause, topify them, diff --git a/src/plugins/value/domains/domain_builder.ml b/src/plugins/value/domains/domain_builder.ml index 7c05474f1b5..d5b24f78bd2 100644 --- a/src/plugins/value/domains/domain_builder.ml +++ b/src/plugins/value/domains/domain_builder.ml @@ -39,7 +39,8 @@ module type LeafDomain = sig t Abstract_domain.logic_environment -> t -> predicate -> Alarmset.status val reduce_by_predicate: t Abstract_domain.logic_environment -> t -> predicate -> bool -> t or_bottom - val interpret_acsl_extension: acsl_extension -> t -> t + val interpret_acsl_extension: + acsl_extension -> t Abstract_domain.logic_environment -> t -> t val enter_loop: stmt -> t -> t val incr_loop_counter: stmt -> t -> t @@ -65,7 +66,7 @@ module Complete (Domain: InputDomain) = struct let evaluate_predicate _env _state _predicate = Alarmset.Unknown let reduce_by_predicate _env state _predicate _positive = `Value state - let interpret_acsl_extension _extension state = state + let interpret_acsl_extension _extension _env state = state let enter_loop _stmt state = state let incr_loop_counter _stmt state = state @@ -546,8 +547,8 @@ module Restrict then Some (f state, mode) else x - let interpret_acsl_extension extension = - lift (Domain.interpret_acsl_extension extension) + let interpret_acsl_extension extension env = + lift (Domain.interpret_acsl_extension extension (lift_env env)) let enter_scope kind varinfos = lift (Domain.enter_scope kind varinfos) let leave_scope kf varinfos = lift (Domain.leave_scope kf varinfos) diff --git a/src/plugins/value/domains/domain_builder.mli b/src/plugins/value/domains/domain_builder.mli index 4c38846e01f..3fd93d21184 100644 --- a/src/plugins/value/domains/domain_builder.mli +++ b/src/plugins/value/domains/domain_builder.mli @@ -45,7 +45,8 @@ module type LeafDomain = sig t Abstract_domain.logic_environment -> t -> predicate -> Alarmset.status val reduce_by_predicate: t Abstract_domain.logic_environment -> t -> predicate -> bool -> t or_bottom - val interpret_acsl_extension: acsl_extension -> t -> t + val interpret_acsl_extension: + acsl_extension -> t Abstract_domain.logic_environment -> t -> t val enter_loop: stmt -> t -> t val incr_loop_counter: stmt -> t -> t diff --git a/src/plugins/value/domains/domain_product.ml b/src/plugins/value/domains/domain_product.ml index ceda6361b5f..3adc09a4532 100644 --- a/src/plugins/value/domains/domain_product.ml +++ b/src/plugins/value/domains/domain_product.ml @@ -263,9 +263,10 @@ module Make Right.reduce_by_predicate right_env right pred positive >>-: fun right -> left, right - let interpret_acsl_extension extension (left, right) = - Left.interpret_acsl_extension extension left, - Right.interpret_acsl_extension extension right + let interpret_acsl_extension extension env (left, right) = + let left_env, right_env = split_logic_env env in + Left.interpret_acsl_extension extension left_env left, + Right.interpret_acsl_extension extension right_env right let enter_scope kind vars (left, right) = Left.enter_scope kind vars left, Right.enter_scope kind vars right diff --git a/src/plugins/value/domains/taint_domain.ml b/src/plugins/value/domains/taint_domain.ml index 60a72b4b7da..d0ef3151485 100644 --- a/src/plugins/value/domains/taint_domain.ml +++ b/src/plugins/value/domains/taint_domain.ml @@ -512,7 +512,7 @@ let interpret_taint_logic (module Abstract: Abstractions.S) : (module Abstractio in `Value (Abstract.Dom.set key taint state) - let interpret_acsl_extension extension state = + let interpret_acsl_extension extension _env state = if String.equal extension.ext_name "taint" || String.equal extension.ext_name "taints" then diff --git a/src/plugins/value/engine/transfer_logic.ml b/src/plugins/value/engine/transfer_logic.ml index 367c0c0e8e7..95f0220637e 100644 --- a/src/plugins/value/engine/transfer_logic.ml +++ b/src/plugins/value/engine/transfer_logic.ml @@ -304,7 +304,8 @@ module type LogicDomain = sig t Abstract_domain.logic_environment -> t -> predicate -> Alarmset.status val reduce_by_predicate: t Abstract_domain.logic_environment -> t -> predicate -> bool -> t or_bottom - val interpret_acsl_extension: acsl_extension -> t -> t + val interpret_acsl_extension: + acsl_extension -> t Abstract_domain.logic_environment -> t -> t end module Make @@ -505,8 +506,11 @@ module Make let states = eval_and_reduce kf b active k posts states build_prop build_env in + let interpret_extension extension state = + Domain.interpret_acsl_extension extension (build_env state) state + in List.fold_left - (fun acc e -> States.map (Domain.interpret_acsl_extension e) acc) + (fun acc e -> States.map (interpret_extension e) acc) states b.b_extended in List.fold_left check_one_behavior post_states behaviors @@ -711,7 +715,11 @@ module Make | AVariant _ | AAssigns _ | AAllocation _ | AStmtSpec _ (*TODO*) -> states | AExtended (_, _, extension) -> - States.map (Domain.interpret_acsl_extension extension) states + let interpret_extension extension state = + let env = here_env ~pre:initial_state ~here:state in + Domain.interpret_acsl_extension extension env state + in + States.map (interpret_extension extension) states end diff --git a/src/plugins/value/engine/transfer_logic.mli b/src/plugins/value/engine/transfer_logic.mli index 11ab601df13..99b9b94b2c6 100644 --- a/src/plugins/value/engine/transfer_logic.mli +++ b/src/plugins/value/engine/transfer_logic.mli @@ -73,7 +73,8 @@ module type LogicDomain = sig t Abstract_domain.logic_environment -> t -> predicate -> Alarmset.status val reduce_by_predicate: t Abstract_domain.logic_environment -> t -> predicate -> bool -> t or_bottom - val interpret_acsl_extension: acsl_extension -> t -> t + val interpret_acsl_extension: + acsl_extension -> t Abstract_domain.logic_environment -> t -> t end module Make -- GitLab