diff --git a/src/kernel_services/ast_data/annotations.ml b/src/kernel_services/ast_data/annotations.ml index fe0c8bbf67e4f83d23c396f930fa6bdb52bbcf31..a33ba44e4a4086fda409023222c21278420b60db 100644 --- a/src/kernel_services/ast_data/annotations.ml +++ b/src/kernel_services/ast_data/annotations.ml @@ -589,6 +589,9 @@ let fold_global f = h acc) +let iter_behaviors f kf = + List.iter f (behaviors kf) + let iter_spec_gen get iter f kf = try let tbl = Funspecs.find kf in @@ -604,7 +607,7 @@ let iter_spec_gen get iter f kf = with Not_found -> () -let iter_behaviors f = +let iter_behaviors_by_emitter f = iter_spec_gen (fun s -> s.spec_behavior) (fun f l -> List.iter (fun b -> f { b with b_name = b.b_name}) l) @@ -657,6 +660,9 @@ let iter_allocates f = let iter_extended f = iter_bhv_gen (fun b -> b.b_extended) List.iter f +let fold_behaviors f kf acc = + List.fold_left (Fun.flip f) acc (behaviors kf) + let fold_spec_gen get fold f kf acc = try let tbl = Funspecs.find kf in @@ -672,7 +678,7 @@ let fold_spec_gen get fold f kf acc = with Not_found -> acc -let fold_behaviors f = +let fold_behaviors_by_emitter f = fold_spec_gen (fun s -> s.spec_behavior) (fun f l acc -> diff --git a/src/kernel_services/ast_data/annotations.mli b/src/kernel_services/ast_data/annotations.mli index d503ea5bd03b8d7b9ec1d92fb90cc8e8114d24fe..17b568e01cc5bd05ed5fa572b5532a6d8deb2410 100644 --- a/src/kernel_services/ast_data/annotations.mli +++ b/src/kernel_services/ast_data/annotations.mli @@ -225,13 +225,27 @@ val fold_extended: kernel_function -> string -> 'a -> 'a val iter_behaviors: - (Emitter.t -> funbehavior -> unit) -> kernel_function -> unit + (funbehavior -> unit) -> kernel_function -> unit (** Iter on the behaviors of the given kernel function. - @since Fluorine-20130401 *) + @since Fluorine-20130401 + @before Frama-C+dev previous version was behaving as + {!iter_behaviors_by_emitter} *) val fold_behaviors: + (funbehavior -> 'a -> 'a) -> kernel_function -> 'a -> 'a +(** Fold on the behaviors of the given kernel function. + @before Frama-C+dev previous version was behaving as + {!fold_behaviors_by_emitter} *) + +val iter_behaviors_by_emitter: + (Emitter.t -> funbehavior -> unit) -> kernel_function -> unit +(** Iter on the behaviors, for each emitter, of the given kernel function. + @since Frama-C+dev *) + +val fold_behaviors_by_emitter: (Emitter.t -> funbehavior -> 'a -> 'a) -> kernel_function -> 'a -> 'a -(** Fold on the behaviors of the given kernel function. *) +(** Fold on the behaviors, for each emitter, of the given kernel function. + @since Frama-C+dev *) val iter_complete: (Emitter.t -> string list -> unit) -> kernel_function -> unit diff --git a/src/kernel_services/visitors/visitor.ml b/src/kernel_services/visitors/visitor.ml index 2dc1b32fcad19835139430f115705a1b9654f3f2..32487e3fa067cba9526f03cb0f299b560b452381 100644 --- a/src/kernel_services/visitors/visitor.ml +++ b/src/kernel_services/visitors/visitor.ml @@ -390,7 +390,7 @@ class internal_generic_frama_c_visitor fundec queue current_kf behavior: frama_c let kf = Option.get self#current_kf in let new_kf = Visitor_behavior.Get.kernel_function self#behavior kf in let old_behaviors = - Annotations.fold_behaviors (fun e b acc -> (e,b)::acc) kf [] + Annotations.fold_behaviors_by_emitter (fun e b acc -> (e,b)::acc) kf [] in let old_complete = Annotations.fold_complete (fun e c acc -> (e,c)::acc) kf [] diff --git a/src/plugins/e-acsl/examples/demo/script.ml b/src/plugins/e-acsl/examples/demo/script.ml index bca0d3708ad9c754898d14f3b2c44edfc8bc5ef7..bcf4625f4ff0e5c925c42998ab78702abc6beb56 100644 --- a/src/plugins/e-acsl/examples/demo/script.ml +++ b/src/plugins/e-acsl/examples/demo/script.ml @@ -63,7 +63,7 @@ let is_predicate p line = (fst (p.ip_loc)).Lexing.pos_lnum = line let search_funspec_part iter convert kf = try Annotations.iter_behaviors - (fun _ bhv -> iter (fun _ a -> convert bhv a) kf bhv.b_name) + (fun bhv -> iter (fun _ a -> convert bhv a) kf bhv.b_name) kf; assert false with Found(ppt, line) -> diff --git a/src/plugins/e-acsl/src/analyses/memory_tracking.ml b/src/plugins/e-acsl/src/analyses/memory_tracking.ml index 11cf5f2420a856a6f737b59f10d5a41aed664029..ddc26d216b4f54386a5f386dffa1a6f1bb6df97f 100644 --- a/src/plugins/e-acsl/src/analyses/memory_tracking.ml +++ b/src/plugins/e-acsl/src/analyses/memory_tracking.ml @@ -460,7 +460,7 @@ module rec Transfer let state = if (is_first || is_last) && Functions.RTL.is_generated_kf kf then Annotations.fold_behaviors - (fun _ bhv s -> + (fun bhv s -> let handle_annot test f s = if test then f diff --git a/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml b/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml index ba0d33bb5641c02b1f7d7b44d8b626528274a73e..12286c8e69bc9c50731fb4341a7f2fce432f1dd7 100644 --- a/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml +++ b/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml @@ -253,7 +253,7 @@ let dup_global loc spec sound_verdict_vi kf vi new_vi = with neither contract nor body *) if Kernel_function.is_definition kf then begin let old_bhvs = - Annotations.fold_behaviors (fun e b acc -> (e, b) :: acc) kf [] + Annotations.fold_behaviors_by_emitter (fun e b acc -> (e, b) :: acc) kf [] in List.iter (fun (e, b) -> Annotations.remove_behavior ~force:true e kf b) diff --git a/src/plugins/instantiate/transform.ml b/src/plugins/instantiate/transform.ml index 48b2f08ee23fae975c0d7e64b8e6ccc9d066a0fe..3310e454ec3de0298e160b8b621c3671a410aaf7 100644 --- a/src/plugins/instantiate/transform.ml +++ b/src/plugins/instantiate/transform.ml @@ -145,7 +145,7 @@ let compute_postconditions_statuses kf = List.iter validate_property (Property.ip_post_cond_of_behavior kf ~active:[] Kglobal bhv) in - Annotations.iter_behaviors (fun _ -> posts) kf + Annotations.iter_behaviors posts kf let compute_comp_disj_statuses kf = let open Property in diff --git a/src/plugins/metrics/metrics_acsl.ml b/src/plugins/metrics/metrics_acsl.ml index 0ead13ca412c7d997bfc523f35b10d3ea0d19363..a351c3b1f807b3c7cdd23358da369a9e58e02dcb 100644 --- a/src/plugins/metrics/metrics_acsl.ml +++ b/src/plugins/metrics/metrics_acsl.ml @@ -230,7 +230,7 @@ let treat_behavior local_stats ki b = let add_function_contract_stats kf = let local_stats = get_kf_stats kf in - let treat_behavior _ b = treat_behavior local_stats Kglobal b in + let treat_behavior b = treat_behavior local_stats Kglobal b in Annotations.iter_behaviors treat_behavior kf let add_code_annot_stats stmt _ ca = diff --git a/src/plugins/obfuscator/obfuscate.ml b/src/plugins/obfuscator/obfuscate.ml index fba8a49e215abae7019981c079bb1fca1763026a..15836739fa4b32e075c28ef6cc6b50abcff3fe77 100644 --- a/src/plugins/obfuscator/obfuscate.ml +++ b/src/plugins/obfuscator/obfuscate.ml @@ -212,7 +212,7 @@ let obfuscate_behaviors () = Globals.Functions.iter (fun kf -> let h = Datatype.String.Hashtbl.create 7 in - Annotations.iter_behaviors + Annotations.iter_behaviors_by_emitter (fun emitter b -> if Emitter.equal emitter Emitter.end_user && not (Cil.is_default_behavior b) diff --git a/src/plugins/wp/wpTarget.ml b/src/plugins/wp/wpTarget.ml index cc0d7384a984cc41835a6cb994de8ed578a3365c..19c3fc2c81bdfeced8458317a8b474a3adffbe5e 100644 --- a/src/plugins/wp/wpTarget.ml +++ b/src/plugins/wp/wpTarget.ml @@ -149,7 +149,7 @@ let check_properties behaviors props kf = in List.iter check_stmt stmts in - let check_funbhv _ bv = check_bhv kf Kglobal bv in + let check_funbhv bv = check_bhv kf Kglobal bv in Annotations.iter_behaviors check_funbhv kf ; check_code () diff --git a/tests/libc/check_libc_naming_conventions.ml b/tests/libc/check_libc_naming_conventions.ml index bb8b128d2960a1baded2d1a0b9fd84d5db0b14ce..29354de5799f2a91050f5f8b36255f1b4dd1b6d6 100644 --- a/tests/libc/check_libc_naming_conventions.ml +++ b/tests/libc/check_libc_naming_conventions.ml @@ -56,7 +56,7 @@ let () = | Declaration (_, vi, _, _) -> vi.vattr in if Cil.is_in_libc fun_attrs then begin - Annotations.iter_behaviors (fun _emitter bhv -> + Annotations.iter_behaviors (fun bhv -> List.iter (fun ip -> let pred = Logic_const.pred_of_id_pred ip in warn_if_unnamed "requires" pred;