diff --git a/Makefile b/Makefile index 70092c7cb3418f552d685b555464635837b4c83a..c3c3ecb3c413faad978858ca4b1b5bf5c9eeb0ce 100644 --- a/Makefile +++ b/Makefile @@ -427,6 +427,7 @@ LIB_CMO =\ src/libraries/datatype/type \ src/libraries/datatype/descr \ src/libraries/utils/filepath \ + src/libraries/utils/sanitizer \ src/libraries/utils/pretty_utils \ src/libraries/utils/hook \ src/libraries/utils/bag \ diff --git a/headers/header_spec.txt b/headers/header_spec.txt index 509d0627ae8b5724d772b34288850461b48a0cf7..5a010a2dce7f7db95e4f793f254d6f959aa9862c 100644 --- a/headers/header_spec.txt +++ b/headers/header_spec.txt @@ -672,6 +672,8 @@ src/libraries/utils/rgmap.ml: CEA_LGPL src/libraries/utils/rgmap.mli: CEA_LGPL src/libraries/utils/rich_text.ml: CEA_LGPL src/libraries/utils/rich_text.mli: CEA_LGPL +src/libraries/utils/sanitizer.ml: CEA_LGPL +src/libraries/utils/sanitizer.mli: CEA_LGPL src/libraries/utils/task.ml: CEA_LGPL src/libraries/utils/task.mli: CEA_LGPL src/libraries/utils/unicode.ml: CEA_LGPL @@ -989,8 +991,6 @@ src/plugins/report/csv.ml: CEA_LGPL_OR_PROPRIETARY src/plugins/report/csv.mli: CEA_LGPL_OR_PROPRIETARY src/plugins/report/dump.ml: CEA_LGPL_OR_PROPRIETARY src/plugins/report/dump.mli: CEA_LGPL_OR_PROPRIETARY -src/plugins/report/property_names.ml: CEA_LGPL_OR_PROPRIETARY -src/plugins/report/property_names.mli: CEA_LGPL_OR_PROPRIETARY src/plugins/report/register.ml: CEA_LGPL_OR_PROPRIETARY src/plugins/report/register.mli: CEA_LGPL_OR_PROPRIETARY src/plugins/report/report_parameters.ml: CEA_LGPL_OR_PROPRIETARY diff --git a/src/kernel_services/ast_data/property.ml b/src/kernel_services/ast_data/property.ml index c1b6a0334b9cb81cd722393f7c152557537f3801..d56b9d6d1a3bb895f7b9c4df880a01599e82a7b9 100644 --- a/src/kernel_services/ast_data/property.ml +++ b/src/kernel_services/ast_data/property.ml @@ -764,7 +764,14 @@ let rec pretty_debug fmt = function Cil_types_debug.pp_string s pp_other_loc ol -module Names = struct +(* -------------------------------------------------------------------------- *) +(* --- Legacy Property Names --- *) +(* -------------------------------------------------------------------------- *) + +(* Shall be deprecated *) +module LegacyNames = +struct + module NamesTbl = State_builder.Hashtbl(Datatype.String.Hashtbl)(Datatype.Int) (struct @@ -949,19 +956,200 @@ module Names = struct IndexTbl.add ip unique_name ; unique_name -(* - (** force computation of the unique name identifying the property *) - let make_prop_name_id ip = - ignore (get_prop_name_id ip) +end - let remove_prop_name_id ip = +(* -------------------------------------------------------------------------- *) +(* --- Property Names --- *) +(* -------------------------------------------------------------------------- *) + +module Names = +struct + + open Cil_types + + type part = + | B of behavior + | K of kernel_function + | A of string + | I of identified_predicate + | P of predicate + | T of term + | S of stmt + + let add_part buffer = function + | B bhv -> + if not (Cil.is_default_behavior bhv) + then Sanitizer.add_string buffer bhv.b_name + | K kf -> Sanitizer.add_string buffer (Kernel_function.get_name kf) + | A msg -> Sanitizer.add_string buffer msg + | S stmt -> Sanitizer.add_string buffer (Printf.sprintf "s%d" stmt.sid) + | I { ip_content = { pred_name = a } } + | P { pred_name = a } | T { term_name = a } -> Sanitizer.add_list buffer a + + let rec add_parts buffer = function + | [] -> () + | p::ps -> + let open Sanitizer in + add_part buffer p ; add_sep buffer ; add_parts buffer ps + + let rec parts_of_property ip : part list = + match ip with + | IPBehavior(kf,Kglobal,_,bhv) -> + [ K kf ; B bhv ] + | IPBehavior(kf,Kstmt s,_,bhv) -> + [ K kf ; B bhv ; S s ] + + | IPPredicate (PKAssumes bhv,kf,_,ip) -> + [ K kf ; B bhv ; A "assumes" ; I ip ] + | IPPredicate (PKRequires bhv,kf,_,ip) -> + [ K kf ; B bhv ; A "requires" ; I ip ] + | IPPredicate (PKEnsures(bhv,Normal),kf,_,ip) -> + [ K kf ; B bhv ; A "ensures" ; I ip ] + | IPPredicate (PKEnsures(bhv,Exits),kf,_,ip) -> + [ K kf ; B bhv ; A "exits" ; I ip ] + | IPPredicate (PKEnsures(bhv,Breaks),kf,_,ip) -> + [ K kf ; B bhv ; A "breaks" ; I ip ] + | IPPredicate (PKEnsures(bhv,Continues),kf,_,ip) -> + [ K kf ; B bhv ; A "continues" ; I ip ] + | IPPredicate (PKEnsures(bhv,Returns),kf,_,ip) -> + [ K kf ; B bhv ; A "returns" ; I ip ] + | IPPredicate (PKTerminates,kf,_,ip) -> + [ K kf ; A "terminates" ; I ip ] + + | IPAllocation(kf,_,Id_contract(_,bhv),_) -> + [ K kf ; B bhv ; A "allocates" ] + | IPAllocation(kf,_,Id_loop _,_) -> + [ K kf ; A "loop_allocates" ] + + | IPAssigns(kf,_,Id_contract(_,bhv),_) -> + [ K kf ; B bhv ; A "assigns" ] + + | IPAssigns(kf,_,Id_loop _,_) -> + [ K kf ; A "loop_assigns" ] + + | IPFrom(kf,_,Id_contract(_,bhv),_) -> + [ K kf ; B bhv ; A "assigns_from" ] + + | IPFrom(kf,_,Id_loop _,_) -> + [ K kf ; A "loop_assigns_from" ] + + | IPDecrease (kf,_,None,_) -> + [ K kf ; A "variant" ] + + | IPDecrease (kf,_,Some _,_) -> + [ K kf ; A "loop_variant" ] + + | IPCodeAnnot (kf,stmt, { annot_content = AStmtSpec _ } ) -> + [ K kf ; A "contract" ; S stmt ] + + | IPCodeAnnot (kf,stmt, { annot_content = APragma _ } ) -> + [ K kf ; A "pragma" ; S stmt ] + + | IPCodeAnnot (kf,stmt, { annot_content = AExtended(_,_,(_,clause,_,_)) } ) + -> [ K kf ; A clause ; S stmt ] + + | IPCodeAnnot (kf,_, { annot_content = AAssert(_,p) } ) -> + [K kf ; A "assert" ; P p ] + | IPCodeAnnot (kf,_, { annot_content = AInvariant(_,true,p) } ) -> + [K kf ; A "loop_invariant" ; P p ] + | IPCodeAnnot (kf,_, { annot_content = AInvariant(_,false,p) } ) -> + [K kf ; A "invariant" ; P p ] + | IPCodeAnnot (kf,_, { annot_content = AVariant(e,_) } ) -> + [K kf ; A "loop_variant" ; T e ] + | IPCodeAnnot (kf,_, { annot_content = AAssigns _ } ) -> + [K kf ; A "loop_assigns" ] + | IPCodeAnnot (kf,_, { annot_content = AAllocation _ } ) -> + [K kf ; A "loop_allocates" ] + + | IPComplete (kf,_,_,cs) -> + (K kf :: A "complete" :: List.map (fun a -> A a) cs) + | IPDisjoint(kf,_,_,cs) -> + (K kf :: A "disjoint" :: List.map (fun a -> A a) cs) + + | IPReachable (None, _, _) -> [] + | IPReachable (Some kf,Kglobal,Before) -> + [ K kf ; A "reachable" ] + | IPReachable (Some kf,Kglobal,After) -> + [ K kf ; A "reachable_post" ] + | IPReachable (Some kf,Kstmt s,Before) -> + [ K kf ; S s ; A "reachable" ] + | IPReachable (Some kf,Kstmt s,After) -> + [ K kf ; S s ; A "reachable_after" ] + + | IPAxiomatic _ + | IPAxiom _ -> [] + | IPLemma(name,_,_,p,_) -> + [ A "lemma" ; A name ; P p ] + + | IPTypeInvariant(name,_,_,_) + | IPGlobalInvariant(name,_,_) -> + [ A "invariant" ; A name ] + + | IPOther(name,OLGlob _) -> [ A name ] + | IPOther(name,OLContract kf) -> [ K kf ; A name ] + | IPOther(name,OLStmt(kf,s)) -> [ K kf ; S s ; A name ] + + | IPExtended(ELGlob,(_,name,_,_)) -> [ A name ] + | IPExtended(ELContract(kf),(_,name,_,_)) -> [ K kf ; A name ] + | IPExtended(ELStmt(kf,s),(_,name,_,_)) -> [ K kf ; S s ; A name ] + + | IPPropertyInstance (_, _, _, ip) -> parts_of_property ip + + let get_prop_basename ?truncate ip = + let buffer = + match truncate with + | None -> Sanitizer.create ~truncate:false 20 + | Some n -> Sanitizer.create ~truncate:true n + in + add_parts buffer (parts_of_property ip) ; + Sanitizer.contents buffer + + (* Numerotation of properties with same basename *) + module NamesTbl = + State_builder.Hashtbl(Datatype.String.Hashtbl)(Datatype.Int) + (struct + let name = "Property.Names.NamesTbl" + let dependencies = [ ] + let size = 97 + end) + + (* Computed name of properties *) + module IndexTbl = (* indexed by Property *) + State_builder.Hashtbl(Hashtbl)(Datatype.String) + (struct + let name = "Property.Names.IndexTbl" + let dependencies = [ Ast.self; NamesTbl.self; Globals.Functions.self ] + let size = 97 + end) + + let self = IndexTbl.self + + let compute_name_id basename = try - ignore (IndexTbl.find ip); - IndexTbl.remove ip - with Not_found -> () -*) + let speed_up_start = NamesTbl.find basename in + (* this basename is already reserved *) + let n,unique_name = Extlib.make_unique_name NamesTbl.mem ~sep:"_" ~start:speed_up_start basename + in NamesTbl.replace basename (succ n) ; (* to speed up Extlib.make_unique_name for next time *) + unique_name + with Not_found -> (* first time that basename is reserved *) + NamesTbl.add basename 2 ; + basename + + let get_prop_name_id ip = + try IndexTbl.find ip + with Not_found -> (* first time we are asking for a name for that [ip] *) + let basename = get_prop_basename ip in + let unique_name = compute_name_id basename in + IndexTbl.add ip unique_name ; + unique_name + end +(* -------------------------------------------------------------------------- *) +(* --- Smart Constructors --- *) +(* -------------------------------------------------------------------------- *) + + let ip_other s le = IPOther(s,le) let ip_reachable_stmt kf ki = IPReachable(Some kf, Kstmt ki, Before) diff --git a/src/kernel_services/ast_data/property.mli b/src/kernel_services/ast_data/property.mli index 254ef04db0c75f395bc00644ebbbd356e9bc2910..3cd66eeffdc9209e1215f21ae0367899b8ddf383 100644 --- a/src/kernel_services/ast_data/property.mli +++ b/src/kernel_services/ast_data/property.mli @@ -461,23 +461,32 @@ val source: identified_property -> Filepath.position option (** {2 names} *) (**************************************************************************) + +(** @since Frama-C+dev deprecated old naming scheeme, + to be removed in future versions. *) +module LegacyNames : +sig + val self: State.t + val get_prop_basename: identified_property -> string + val get_prop_name_id: identified_property -> string +end + (** @since Oxygen-20120901 *) -module Names: sig +module Names : +sig val self: State.t val get_prop_name_id: identified_property -> string (** returns a unique name identifying the property. - This name is built from the basename of the property. *) - - val get_prop_basename: identified_property -> string - (** returns the basename of the property. *) + This name is built from the basename of the property. + @modify Frama-C+dev new naming scheme, Cf. LegacyNames + *) - val reserve_name_id: string -> string -(** returns the name that should be returned by the function - [get_prop_name_id] if the given property has [name] as basename. That name - is reserved so that [get_prop_name_id prop] can never return an identical - name. *) + val get_prop_basename: ?truncate:int -> identified_property -> string + (** returns the basename of the property. + @modify Frama-C+dev additional truncation parameter + *) end diff --git a/src/libraries/utils/sanitizer.ml b/src/libraries/utils/sanitizer.ml new file mode 100644 index 0000000000000000000000000000000000000000..25c9bb0ec739a7baf9311413007bc47bb694a95f --- /dev/null +++ b/src/libraries/utils/sanitizer.ml @@ -0,0 +1,98 @@ +(**************************************************************************) +(* *) +(* This file is part of Frama-C. *) +(* *) +(* Copyright (C) 2007-2018 *) +(* CEA (Commissariat à l'énergie atomique et aux énergies *) +(* alternatives) *) +(* *) +(* you can redistribute it and/or modify it under the terms of the GNU *) +(* Lesser General Public License as published by the Free Software *) +(* Foundation, version 2.1. *) +(* *) +(* It is distributed in the hope that it will be useful, *) +(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) +(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) +(* GNU Lesser General Public License for more details. *) +(* *) +(* See the GNU Lesser General Public License version 2.1 *) +(* for more details (enclosed in the file licenses/LGPLv2.1). *) +(* *) +(**************************************************************************) + +(* -------------------------------------------------------------------------- *) +(* --- Sanitizer --- *) +(* -------------------------------------------------------------------------- *) + +(* + Keeps only alphanumerical characters, + remove consecutive, trailing and leading `_` +*) + +type state = START | SEP | CHAR | TRUNCATE + +type buffer = { + content : Buffer.t ; + truncate : int ; + mutable lastsep : int ; + mutable state : state ; +} + +let create ?(truncate=false) n = { + content = Buffer.create n ; + truncate = if truncate then n else max_int ; + lastsep = 0 ; + state = START ; +} + +let clear buffer = + begin + Buffer.clear buffer.content ; + buffer.state <- START ; + buffer.lastsep <- 0 ; + end + +let add_sep buffer = + if buffer.state = CHAR then + let offset = Buffer.length buffer.content in + if offset < buffer.truncate then + begin + buffer.state <- SEP ; + buffer.lastsep <- offset ; + end + else + begin + buffer.state <- TRUNCATE ; + (* TODO [OCaml 4.05] Buffer.truncate buffer.content buffer.lastsep ; *) + end + +let add_char buffer = function + | ('a'..'z' | 'A'..'Z' | '0'..'9') as c -> + begin + match buffer.state with + | START -> + Buffer.add_char buffer.content c ; + buffer.state <- CHAR + | SEP -> + Buffer.add_char buffer.content '_' ; + Buffer.add_char buffer.content c ; + buffer.state <- CHAR + | CHAR -> + Buffer.add_char buffer.content c + | TRUNCATE -> () + end + | '_' -> add_sep buffer + | _ -> () + +let add_string buffer s = String.iter (add_char buffer) s + +let rec add_list buffer = function + | [] -> () + | p::ps -> add_string buffer p ; add_sep buffer ; add_list buffer ps + +let contents buffer = + (* TODO [OCaml 4.05] simply buffer contents if using Buffer.truncate *) + let s = Buffer.contents buffer.content in + if buffer.state = TRUNCATE then + String.sub s 0 buffer.lastsep + else s diff --git a/src/plugins/report/property_names.mli b/src/libraries/utils/sanitizer.mli similarity index 76% rename from src/plugins/report/property_names.mli rename to src/libraries/utils/sanitizer.mli index 23a5f2ea7261f6c6f6c52f618a6cb48b4d963f7b..ea850a8587f0950630d3ad7d7d6838073de4f8f3 100644 --- a/src/plugins/report/property_names.mli +++ b/src/libraries/utils/sanitizer.mli @@ -20,20 +20,21 @@ (* *) (**************************************************************************) -open Cil_types +(** {2 Sanitizer} -type part = - | B of behavior - | K of kernel_function - | A of string - | I of identified_predicate - | P of predicate - | T of term - | S of stmt + Keeps only alpha-numerical characters. + Separator ['_'] is allowed, but leading, trailing and consecutive + separators are removed. +*) -val is_name : string -> bool -val join : string list -> string +type buffer -val string_of_part : part -> string -val string_of_parts : part list -> string -val parts_of_property : Property.t -> part list +val create : ?truncate:bool -> int -> buffer +val clear : buffer -> unit + +val add_sep : buffer -> unit (** Adds ['_'] character *) +val add_char : buffer -> char -> unit +val add_string : buffer -> string -> unit +val add_list : buffer -> string list -> unit (** Separated with ['_'] *) + +val contents : buffer -> string diff --git a/src/plugins/report/Makefile.in b/src/plugins/report/Makefile.in index 6c6d41d7b0577e1a0fcbff0dea2f61e5745af3a7..c3464e1ebdd7c85ce5b42b63e9e562d102323439 100644 --- a/src/plugins/report/Makefile.in +++ b/src/plugins/report/Makefile.in @@ -36,7 +36,7 @@ endif PLUGIN_DIR ?=. PLUGIN_ENABLE:=@ENABLE_REPORT@ PLUGIN_NAME:=Report -PLUGIN_CMO:= report_parameters scan dump csv property_names classify register +PLUGIN_CMO:= report_parameters scan dump csv classify register PLUGIN_DISTRIBUTED:=$(PLUGIN_ENABLE) PLUGIN_DISTRIB_EXTERNAL:= Makefile.in configure.ac configure #PLUGIN_NO_DEFAULT_TEST:=no diff --git a/src/plugins/report/classify.ml b/src/plugins/report/classify.ml index d7844aa7a51d29087ca33fe2802617c21bf7de2e..e92506e697f099b820ed2632f62330357d604657 100644 --- a/src/plugins/report/classify.ml +++ b/src/plugins/report/classify.ml @@ -74,7 +74,7 @@ let errors = { type props = { ps_name : string ; ps_rules : rule Queue.t ; - ps_action : (unit -> string) ; + ps_action : (unit -> string) ; (* plugin option getter *) } let props ps_name ps_action = @@ -408,19 +408,50 @@ let pending f pending = (fun _ ips -> Property.Set.iter f ips) m) pending +let rec monitored_property ip = + let open Cil_types in + let open Property in + match ip with + | IPBehavior _ -> false + | IPPredicate (PKAssumes _,_,_,_) -> false + | IPPredicate (PKRequires _,_,_,_) -> true + | IPPredicate (PKEnsures _,_,_,_) -> true + | IPPredicate (PKTerminates,_,_,_) -> true + | IPAllocation(_,_,_,_) -> true + | IPAssigns(_,_,_,_) -> true + | IPFrom(_,_,_,_) -> true + | IPDecrease (_,_,_,_) -> true + | IPCodeAnnot (_,_, { annot_content = AStmtSpec _ } ) -> false + | IPCodeAnnot (_,_, { annot_content = APragma _ } ) -> false + | IPCodeAnnot (_,_, { annot_content = AExtended _ } ) -> true + | IPCodeAnnot (_,_, { annot_content = AAssert _ } ) -> true + | IPCodeAnnot (_,_, { annot_content = AInvariant _ } ) -> true + | IPCodeAnnot (_,_, { annot_content = AVariant _ } ) -> true + | IPCodeAnnot (_,_, { annot_content = AAssigns _ } ) -> true + | IPCodeAnnot (_,_, { annot_content = AAllocation _ } ) -> true + | IPComplete (_,_,_,_) -> true + | IPDisjoint(_,_,_,_) -> true + | IPReachable (None,_,_) -> false + | IPReachable (Some _,_,_) -> true + | IPAxiomatic _ | IPAxiom _ -> false + | IPLemma(_,_,_,_,_) -> true + | IPTypeInvariant(_,_,_,_) | IPGlobalInvariant(_,_,_) -> true + | IPOther(_,_) -> true + | IPExtended _ -> true + | IPPropertyInstance (_, _, _, ip) -> monitored_property ip + let monitor_status properties ip = - let ps = Property_names.parts_of_property ip in - if ps = [] then () else - let msg = Property_names.string_of_parts ps in + if monitored_property ip then + let name = Property.Names.get_prop_name_id ip in let lookup = find properties.ps_rules in let source = Property.source ip in let unclassified () = let e_id = "unclassified." ^ properties.ps_name in - let e_title = msg in + let e_title = name in let e_action = properties.ps_action () |> action in let e_descr = T.String.capitalize_ascii properties.ps_name ^ " status" in { unclassified with e_id ; e_action ; e_title ; e_descr } - in monitor ~lookup ~category:[] ~msg ~source unclassified + in monitor ~lookup ~category:[] ~msg:name ~source unclassified let monitor_property pool push ip = begin diff --git a/src/plugins/report/property_names.ml b/src/plugins/report/property_names.ml deleted file mode 100644 index dd0ffca34ea836e827e830b5a6c98ebe9277e260..0000000000000000000000000000000000000000 --- a/src/plugins/report/property_names.ml +++ /dev/null @@ -1,131 +0,0 @@ -(**************************************************************************) -(* *) -(* This file is part of Frama-C. *) -(* *) -(* Copyright (C) 2007-2018 *) -(* CEA (Commissariat à l'énergie atomique et aux énergies *) -(* alternatives) *) -(* *) -(* you can redistribute it and/or modify it under the terms of the GNU *) -(* Lesser General Public License as published by the Free Software *) -(* Foundation, version 2.1. *) -(* *) -(* It is distributed in the hope that it will be useful, *) -(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) -(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) -(* GNU Lesser General Public License for more details. *) -(* *) -(* See the GNU Lesser General Public License version 2.1 *) -(* for more details (enclosed in the file licenses/LGPLv2.1). *) -(* *) -(**************************************************************************) - -open Cil_types - -type part = - | B of behavior - | K of kernel_function - | A of string - | I of identified_predicate - | P of predicate - | T of term - | S of stmt - -let is_name s = s <> "" && s <> "_" -let join ps = String.concat "_" (List.filter is_name ps) - -let string_of_part = function - | B bhv -> if Cil.is_default_behavior bhv then "" else bhv.b_name - | K kf -> Kernel_function.get_name kf - | A msg -> msg - | S stmt -> Printf.sprintf "s%d" stmt.sid - | I { ip_content = { pred_name = a } } - | P { pred_name = a } | T { term_name = a } -> join a - -let string_of_parts ps = join (List.map string_of_part ps) - -let rec parts_of_property ip : part list = - let open Property in - match ip with - | IPBehavior _ -> [] - | IPPredicate (PKAssumes _,_,_,_) -> [] - | IPPredicate (PKRequires bhv,kf,_,ip) -> - [ K kf ; B bhv ; A "requires" ; I ip ] - | IPPredicate (PKEnsures(bhv,Normal),kf,_,ip) -> - [ K kf ; B bhv ; A "ensures" ; I ip ] - | IPPredicate (PKEnsures(bhv,Exits),kf,_,ip) -> - [ K kf ; B bhv ; A "exits" ; I ip ] - | IPPredicate (PKEnsures(bhv,Breaks),kf,_,ip) -> - [ K kf ; B bhv ; A "breaks" ; I ip ] - | IPPredicate (PKEnsures(bhv,Continues),kf,_,ip) -> - [ K kf ; B bhv ; A "continues" ; I ip ] - | IPPredicate (PKEnsures(bhv,Returns),kf,_,ip) -> - [ K kf ; B bhv ; A "returns" ; I ip ] - | IPPredicate (PKTerminates,kf,_,ip) -> - [ K kf ; A "terminates" ; I ip ] - - | IPAllocation(kf,_,Id_contract(_,bhv),_) -> - [ K kf ; B bhv ; A "allocates" ] - | IPAllocation(kf,_,Id_loop _,_) -> - [ K kf ; A "loop_allocates" ] - - | IPAssigns(kf,_,Id_contract(_,bhv),_) -> - [ K kf ; B bhv ; A "assigns" ] - - | IPAssigns(kf,_,Id_loop _,_) -> - [ K kf ; A "loop_assigns" ] - - | IPFrom(kf,_,Id_contract(_,bhv),_) -> - [ K kf ; B bhv ; A "assigns_from" ] - - | IPFrom(kf,_,Id_loop _,_) -> - [ K kf ; A "loop_assigns_from" ] - - | IPDecrease (kf,_,None,_) -> - [ K kf ; A "variant" ] - - | IPDecrease (kf,_,Some _,_) -> - [ K kf ; A "loop_variant" ] - - | IPCodeAnnot (_,_, { annot_content = AStmtSpec _ } ) -> [] - | IPCodeAnnot (_,_, { annot_content = APragma _ | AExtended _ } ) -> [] - | IPCodeAnnot (kf,_, { annot_content = AAssert(_,p) } ) -> - [K kf ; A "assert" ; P p ] - | IPCodeAnnot (kf,_, { annot_content = AInvariant(_,true,p) } ) -> - [K kf ; A "loop_invariant" ; P p ] - | IPCodeAnnot (kf,_, { annot_content = AInvariant(_,false,p) } ) -> - [K kf ; A "invariant" ; P p ] - | IPCodeAnnot (kf,_, { annot_content = AVariant(e,_) } ) -> - [K kf ; A "loop_variant" ; T e ] - | IPCodeAnnot (kf,_, { annot_content = AAssigns _ } ) -> - [K kf ; A "loop_assigns" ] - | IPCodeAnnot (kf,_, { annot_content = AAllocation _ } ) -> - [K kf ; A "loop_allocates" ] - - | IPComplete (kf,_,_,cs) -> - (K kf :: A "complete" :: List.map (fun a -> A a) cs) - | IPDisjoint(kf,_,_,cs) -> - (K kf :: A "disjoint" :: List.map (fun a -> A a) cs) - - | IPReachable (None, _, _) -> [] - | IPReachable (Some kf,Kglobal,Before) -> - [ K kf ; A "reachable" ] - | IPReachable (Some kf,Kglobal,After) -> - [ K kf ; A "reachable_post" ] - | IPReachable (Some kf,Kstmt s,Before) -> - [ K kf ; S s ; A "reachable" ] - | IPReachable (Some kf,Kstmt s,After) -> - [ K kf ; S s ; A "reachable_after" ] - | IPAxiomatic _ | IPAxiom _ -> [] - | IPLemma(name,_,_,_,_) -> [ A "lemma" ; A name ] - | IPTypeInvariant(name,_,_,_) - | IPGlobalInvariant(name,_,_) -> [ A "invariant" ; A name] - | IPOther(name, OLContract kf) -> [ K kf ; A name ] - | IPOther(name, OLStmt (kf, s)) -> [K kf; S s; A name] - | IPOther(name,OLGlob _) -> [ A name ] - | IPPropertyInstance (_, _, _, ip) -> parts_of_property ip - | IPExtended(ELContract kf,(_,name,_,_)) -> [ K kf ; A name ] - | IPExtended(ELStmt (kf, s),(_,name,_,_)) -> [ K kf ; S s ; A name ] - | IPExtended(ELGlob, (_,name,_,_)) -> [ A name ] - -(**************************************************************************) diff --git a/src/plugins/report/tests/report/oracle/classify.0.res.oracle b/src/plugins/report/tests/report/oracle/classify.0.res.oracle index 08e3a2f22246d9b0ce10e23016c15f9413fe8218..2d9f271aea5752a9bbc3037c9c42b90aac05b38e 100644 --- a/src/plugins/report/tests/report/oracle/classify.0.res.oracle +++ b/src/plugins/report/tests/report/oracle/classify.0.res.oracle @@ -4,8 +4,8 @@ [wp] Running WP plugin... [wp] Warning: Missing RTE guards [wp] 2 goals scheduled -[wp] [Qed] Goal typed_f_assign : Valid -[wp] [Qed] Goal typed_f_post : Valid +[wp] [Qed] Goal typed_f_assigns : Valid +[wp] [Qed] Goal typed_f_ensures : Valid [wp] Proved goals: 2 / 2 Qed: 2 [report] Classification diff --git a/src/plugins/report/tests/report/oracle/classify.1.res.oracle b/src/plugins/report/tests/report/oracle/classify.1.res.oracle index 5dc01f6e288d62097d7aeb8bcff5de4b9a758aeb..9266851bb999c61aaf138053b920459d475fb73d 100644 --- a/src/plugins/report/tests/report/oracle/classify.1.res.oracle +++ b/src/plugins/report/tests/report/oracle/classify.1.res.oracle @@ -5,8 +5,8 @@ [wp] Running WP plugin... [wp] Warning: Missing RTE guards [wp] 2 goals scheduled -[wp] [Qed] Goal typed_f_assign : Valid -[wp] [Qed] Goal typed_f_post : Valid +[wp] [Qed] Goal typed_f_assigns : Valid +[wp] [Qed] Goal typed_f_ensures : Valid [wp] Proved goals: 2 / 2 Qed: 2 [report] Classification diff --git a/src/plugins/report/tests/report/oracle/classify.2.res.oracle b/src/plugins/report/tests/report/oracle/classify.2.res.oracle index 0d4bf582b12dcdfdfcd194cce2b00f461d03f48b..8e0f90163361e74984979077ddaa1a85702be12e 100644 --- a/src/plugins/report/tests/report/oracle/classify.2.res.oracle +++ b/src/plugins/report/tests/report/oracle/classify.2.res.oracle @@ -5,8 +5,8 @@ [wp] Running WP plugin... [wp] Warning: Missing RTE guards [wp] 2 goals scheduled -[wp] [Qed] Goal typed_f_assign : Valid -[wp] [Qed] Goal typed_f_post : Valid +[wp] [Qed] Goal typed_f_assigns : Valid +[wp] [Qed] Goal typed_f_ensures : Valid [wp] Proved goals: 2 / 2 Qed: 2 [report] Classification diff --git a/src/plugins/report/tests/report/oracle/classify.3.res.oracle b/src/plugins/report/tests/report/oracle/classify.3.res.oracle index e41bd323df63f3913f41fe42d9e7ac2fdf50227b..5fab349a04e38664af8b21b15febbb573588c6c7 100644 --- a/src/plugins/report/tests/report/oracle/classify.3.res.oracle +++ b/src/plugins/report/tests/report/oracle/classify.3.res.oracle @@ -6,8 +6,8 @@ [wp] Running WP plugin... [wp] Warning: Missing RTE guards [wp] 2 goals scheduled -[wp] [Qed] Goal typed_f_assign : Valid -[wp] [Qed] Goal typed_f_post : Valid +[wp] [Qed] Goal typed_f_assigns : Valid +[wp] [Qed] Goal typed_f_ensures : Valid [wp] Proved goals: 2 / 2 Qed: 2 [report] Classification diff --git a/src/plugins/report/tests/report/oracle/classify.4.res.oracle b/src/plugins/report/tests/report/oracle/classify.4.res.oracle index 70e846d1bf34b306e607d9579046c28735bb18d0..4fe970e76ac2d9a5d2c965d22a6f185ebaeb2f95 100644 --- a/src/plugins/report/tests/report/oracle/classify.4.res.oracle +++ b/src/plugins/report/tests/report/oracle/classify.4.res.oracle @@ -6,8 +6,8 @@ [wp] Running WP plugin... [wp] Warning: Missing RTE guards [wp] 2 goals scheduled -[wp] [Qed] Goal typed_f_assign : Valid -[wp] [Qed] Goal typed_f_post : Valid +[wp] [Qed] Goal typed_f_assigns : Valid +[wp] [Qed] Goal typed_f_ensures : Valid [wp] Proved goals: 2 / 2 Qed: 2 [report] Classification diff --git a/src/plugins/report/tests/report/oracle/classify.5.res.oracle b/src/plugins/report/tests/report/oracle/classify.5.res.oracle index da6f9a37f4f68fd31782b82428ff795cf9ea9ebc..fe7d84466c0e64effca171af82723994cecf7759 100644 --- a/src/plugins/report/tests/report/oracle/classify.5.res.oracle +++ b/src/plugins/report/tests/report/oracle/classify.5.res.oracle @@ -5,8 +5,8 @@ unbound logic variable ignored. Ignoring code annotation [wp] Running WP plugin... [wp] Warning: Missing RTE guards -[wp] Goal typed_f_post : not tried -[wp] Goal typed_f_assign : trivial +[wp] Goal typed_f_ensures : not tried +[wp] Goal typed_f_assigns : trivial [report] Classification [report] Output tests/report/result/classified.5.json [report] Reviews : 2