Commit 6a3af3b2 authored by Loïc Correnson's avatar Loïc Correnson

[wp] added post-effects to global assigns

parent de09f05c
...@@ -90,7 +90,7 @@ struct ...@@ -90,7 +90,7 @@ struct
(* Authorized written region from an assigns specification *) (* Authorized written region from an assigns specification *)
type effect = { type effect = {
e_pid : P.t ; (* Assign Property *) e_pid : P.t ; (* Assign Property *)
e_kind : a_kind ; (* Requires post effects (in case of loop-assigns) *) e_post : bool ; (* Requires post effects (loop-assigns or post-assigns) *)
e_label : c_label ; (* scope for collection *) e_label : c_label ; (* scope for collection *)
e_valid : L.sigma ; (* sigma where locations are filtered for validity *) e_valid : L.sigma ; (* sigma where locations are filtered for validity *)
e_region : L.region ; (* expected from spec *) e_region : L.region ; (* expected from spec *)
...@@ -444,21 +444,23 @@ struct ...@@ -444,21 +444,23 @@ struct
ainfo.a_assigns ainfo.a_assigns
in match authorized_region with in match authorized_region with
| None -> None | None -> None
| Some region -> Some { | Some region ->
e_pid = pid ; let post = match ainfo.a_kind with
e_kind = ainfo.a_kind ; | LoopAssigns -> true
e_label = from ; | StmtAssigns -> NormAtLabels.has_postassigns ainfo.a_assigns
e_valid = sigma ; in Some {
e_region = region ; e_pid = pid ;
e_warn = Warning.Set.empty ; e_post = post ;
} e_label = from ;
e_valid = sigma ;
e_region = region ;
e_warn = Warning.Set.empty ;
}
let cc_posteffect e vcs = let cc_posteffect e vcs =
match e.e_kind with if not e.e_post then vcs else
| StmtAssigns -> vcs let vc = { empty_vc with vars = L.vars e.e_region } in
| LoopAssigns -> Gmap.add (Gposteffect e.e_pid) (Splitter.singleton vc) vcs
let vc = { empty_vc with vars = L.vars e.e_region } in
Gmap.add (Gposteffect e.e_pid) (Splitter.singleton vc) vcs
(* -------------------------------------------------------------------------- *) (* -------------------------------------------------------------------------- *)
(* --- WP RULES : adding axioms, hypotheses and goals --- *) (* --- WP RULES : adding axioms, hypotheses and goals --- *)
...@@ -549,14 +551,13 @@ struct ...@@ -549,14 +551,13 @@ struct
vars = xs } vars = xs }
in in
let group = let group =
match e.e_kind with if not e.e_post then
| StmtAssigns -> Splitter.singleton (setup empty_vc)
Splitter.singleton (setup empty_vc) else
| LoopAssigns -> try Splitter.map setup (Gmap.find (Gposteffect e.e_pid) vcs)
try Splitter.map setup (Gmap.find (Gposteffect e.e_pid) vcs) with Not_found ->
with Not_found -> Wp_parameters.fatal "Missing post-effect for %a"
Wp_parameters.fatal "Missing post-effect for %a" WpPropId.pretty e.e_pid
WpPropId.pretty e.e_pid
in in
let target = match sloc with let target = match sloc with
| None -> Gprop e.e_pid | None -> Gprop e.e_pid
......
...@@ -74,6 +74,11 @@ let of_logic = function ...@@ -74,6 +74,11 @@ let of_logic = function
| BuiltinLabel LoopEntry -> loopentry | BuiltinLabel LoopEntry -> loopentry
| StmtLabel s -> stmt !s | StmtLabel s -> stmt !s
let is_post = function
| BuiltinLabel Post -> true
| FormalLabel a -> a = post
| _ -> false
let name = function FormalLabel a -> a | _ -> "" let name = function FormalLabel a -> a | _ -> ""
let lookup labels a = let lookup labels a =
......
...@@ -65,6 +65,9 @@ val of_logic : Cil_types.logic_label -> c_label ...@@ -65,6 +65,9 @@ val of_logic : Cil_types.logic_label -> c_label
labels. Ambiguous labels are: Old, LoopEntry and LoopCurrent, since labels. Ambiguous labels are: Old, LoopEntry and LoopCurrent, since
they points to different program points dependending on the context. *) they points to different program points dependending on the context. *)
val is_post : Cil_types.logic_label -> bool
(** Checks whether the logic-label is [Post] or [to_logic post] *)
val pretty : Format.formatter -> c_label -> unit val pretty : Format.formatter -> c_label -> unit
open Cil_types open Cil_types
......
...@@ -210,9 +210,27 @@ let preproc_assigns labels asgns = ...@@ -210,9 +210,27 @@ let preproc_assigns labels asgns =
let visitor = new norm_at labels in let visitor = new norm_at labels in
List.map (Visitor.visitFramacFrom visitor) asgns List.map (Visitor.visitFramacFrom visitor) asgns
let has_postassigns = function
| WritesAny -> false
| Writes froms ->
let exception HAS_POST in
let visitor = new norm_at (fun l ->
if Clabels.is_post l then raise HAS_POST
else Clabels.of_logic l
) in
try
List.iter
(fun fr -> ignore @@ Visitor.visitFramacFrom visitor fr)
froms ;
false
with HAS_POST ->
true
let catch_label_error ex txt1 txt2 = match ex with let catch_label_error ex txt1 txt2 = match ex with
| LabelError lab -> | LabelError lab ->
Wp_parameters.warning Wp_parameters.warning
"Unexpected label %a in %s : ignored %s" "Unexpected label %a in %s : ignored %s"
Wp_error.pp_logic_label lab txt1 txt2 Wp_error.pp_logic_label lab txt1 txt2
| _ -> raise ex | _ -> raise ex
(* -------------------------------------------------------------------------- *)
...@@ -42,5 +42,5 @@ val labels_predicate : (logic_label * logic_label) list -> label_mapping ...@@ -42,5 +42,5 @@ val labels_predicate : (logic_label * logic_label) list -> label_mapping
val labels_axiom : label_mapping val labels_axiom : label_mapping
val preproc_annot : label_mapping -> predicate -> predicate val preproc_annot : label_mapping -> predicate -> predicate
val preproc_assigns : label_mapping -> from list -> from list val preproc_assigns : label_mapping -> from list -> from list
val has_postassigns : assigns -> bool
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment