diff --git a/src/kernel_internals/runtime/special_hooks.ml b/src/kernel_internals/runtime/special_hooks.ml index 96deb0afdae6330f7d383b4a44339077ae9435f0..9c4ebad617365527cf71277e10a5884b17703b79 100644 --- a/src/kernel_internals/runtime/special_hooks.ml +++ b/src/kernel_internals/runtime/special_hooks.ml @@ -277,7 +277,7 @@ let warn_if_another_compiler_builtin name = depends on Ast_info *) let on_call_to_undeclared_function vi = let name = vi.Cil_types.vname in - if not (Ast_info.is_frama_c_builtin name) then begin + if not (Ast_info.start_with_frama_c_builtin name) then begin if not (warn_if_another_compiler_builtin name) then Kernel.warning ~wkey:Kernel.wkey_implicit_function_declaration ~current:true ~once:true diff --git a/src/kernel_internals/typing/ghost_accesses.ml b/src/kernel_internals/typing/ghost_accesses.ml index aba019286b2148db0fc9d9689ff377d4bc3298dc..3d017490d7d37b0099814ee2fd6e4e67ef584c78 100644 --- a/src/kernel_internals/typing/ghost_accesses.ml +++ b/src/kernel_internals/typing/ghost_accesses.ml @@ -172,22 +172,18 @@ class visitor = object(self) if not (isGhostType (typeOfLval lv)) then Error.assigns_non_ghost_lvalue ~current:true lv in - let is_builtin vi = - Ast_info.is_frama_c_builtin vi.vname || - Cil_builtins.is_builtin vi - in let failed = match i with | Call(_, fexp, _, _) -> begin match Kernel_function.(Option.map get_vi @@ get_called fexp) with | Some fct - when not (is_builtin fct) && not fct.vghost -> + when not (Ast_info.is_frama_c_builtin fct) && not fct.vghost -> Error.non_ghost_function_call_in_ghost ~current:true () ; true | None -> Error.function_pointer_call ~current:true () ; true | _ -> false end | Local_init(_, ConsInit(fct, _, _), _) - when not (is_builtin fct) && not fct.vghost -> + when not (Ast_info.is_frama_c_builtin fct) && not fct.vghost -> Error.non_ghost_function_call_in_ghost ~current:true () ; true | _ -> false in @@ -200,10 +196,10 @@ class visitor = object(self) | Call(_, fexp, _, _) -> let vi = Kernel_function.(get_vi @@ Option.get @@ get_called fexp) in - if not (is_builtin vi) then + if not (Ast_info.is_frama_c_builtin vi) then error_if_incompatible lv (getReturnType (typeOf fexp)) fexp | Local_init(_, ConsInit(fct, _, _), _) -> - if not (is_builtin fct) then + if not (Ast_info.is_frama_c_builtin fct) then error_if_incompatible lv (getReturnType fct.vtype) (evar fct) | _ -> () end diff --git a/src/kernel_services/ast_queries/ast_info.ml b/src/kernel_services/ast_queries/ast_info.ml index 5030a6d76bd152f57382bd79873086bc11eed9b9..b9da577467a961ca1a8e3b2c7ebbaf1cd577df51 100644 --- a/src/kernel_services/ast_queries/ast_info.ml +++ b/src/kernel_services/ast_queries/ast_info.ml @@ -465,33 +465,37 @@ let pointed_type ty = (** {2 Predefined} *) (* ************************************************************************** *) -let can_be_cea_function name = - String.starts_with ~prefix:"Frama_" name +let start_with_frama_c name = + String.starts_with ~prefix:"Frama_C_" name -let is_cea_function name = +let is_show_each_builtin name = String.starts_with ~prefix:"Frama_C_show_each" name -let is_cea_domain_function name = +let is_domain_show_each_builtin name = String.starts_with ~prefix:"Frama_C_domain_show_each" name -let is_cea_dump_function name = +let is_dump_each_builtin name = String.starts_with ~prefix:"Frama_C_dump_each" name -let is_cea_dump_file_function name = +let is_dump_file_builtin name = String.starts_with ~prefix:"Frama_C_dump_each_file" name -let is_cea_builtin name = - String.starts_with ~prefix:"Frama_C_builtin" name +let is_split_builtin name = + String.starts_with ~prefix:"Frama_C_builtin_split" name -let is_frama_c_builtin n = - can_be_cea_function n && - (is_cea_dump_function n || - is_cea_function n || - is_cea_builtin n || - is_cea_domain_function n || - is_cea_dump_file_function n) +let start_with_frama_c_builtin n = + start_with_frama_c n && + (is_dump_each_builtin n || + is_show_each_builtin n || + is_split_builtin n || + is_domain_show_each_builtin n || + is_dump_file_builtin n) + +let () = Cil_builtins.add_special_builtin_family start_with_frama_c_builtin + +let is_frama_c_builtin v = + Cil_builtins.has_fc_builtin_attr v || start_with_frama_c_builtin v.vname -let () = Cil_builtins.add_special_builtin_family is_frama_c_builtin (* Local Variables: diff --git a/src/kernel_services/ast_queries/ast_info.mli b/src/kernel_services/ast_queries/ast_info.mli index b068cb7fac8bb92949e2f65de23804d936f63c43..771f071232a5cf47d5b2d2feb75f59bb744021a2 100644 --- a/src/kernel_services/ast_queries/ast_info.mli +++ b/src/kernel_services/ast_queries/ast_info.mli @@ -240,12 +240,46 @@ end (** {2 Predefined} *) (* ************************************************************************** *) -val can_be_cea_function : string -> bool -val is_cea_function : string -> bool -val is_cea_domain_function : string -> bool -val is_cea_dump_function : string -> bool -val is_cea_dump_file_function : string -> bool -val is_frama_c_builtin : string -> bool +val start_with_frama_c: string -> bool +(** @return true if the given string starts with ["Frama_C_"]. + @since Frama-C+dev +*) + +val is_show_each_builtin: string -> bool +(** @return true if the given string starts with ["Frama_C_show_each"]. + @since Frama-C+dev +*) + +val is_domain_show_each_builtin: string -> bool +(** @return true if the given string starts with ["Frama_C_domain_show_each"]. + @since Frama-C+dev +*) + +val is_dump_each_builtin: string -> bool +(** @return true if the given string starts with ["Frama_C_dump_each"]. + @since Frama-C+dev +*) + +val is_dump_file_builtin: string -> bool +(** @return true if the given string starts with ["Frama_C_dump_each_file"]. + @since Frama-C+dev +*) + +val is_split_builtin: string -> bool +(** @return true if the given string starts with ["Frama_C_builtin_split"]. + @since Frama-C+dev +*) + +val start_with_frama_c_builtin: string -> bool +(** @return true if the given string starts with ["Frama_C_"]. + @since Frama-C+dev +*) + +val is_frama_c_builtin: varinfo -> bool +(** @return true if {!start_with_frama_c_builtin} or + {!Cil_builtins.has_fc_builtin_attr} are true. + @before Frama-C+dev Behave like {!start_with_frama_c_builtin}. +*) (* Local Variables: diff --git a/src/kernel_services/ast_queries/cil_builtins.ml b/src/kernel_services/ast_queries/cil_builtins.ml index a2cdec06341601b2e2f0602b099678f4e06a3532..c80b32e7484b1a703e85d748253a8919524fe330 100644 --- a/src/kernel_services/ast_queries/cil_builtins.ml +++ b/src/kernel_services/ast_queries/cil_builtins.ml @@ -56,9 +56,9 @@ module Frama_c_builtins = let size = 3 end) -let is_builtin v = Cil.hasAttribute "FC_BUILTIN" v.vattr +let has_fc_builtin_attr v = Cil.hasAttribute "FC_BUILTIN" v.vattr -let is_unused_builtin v = is_builtin v && not v.vreferenced +let is_unused_builtin v = has_fc_builtin_attr v && not v.vreferenced (* [VP] Should we projectify this ?*) @@ -68,6 +68,9 @@ let special_builtins = Queue.create () let is_special_builtin s = Queue.fold (fun res f -> res || f s) false special_builtins +let is_builtin v = + has_fc_builtin_attr v || is_special_builtin v.vname + let add_special_builtin_family f = Queue.add f special_builtins let add_special_builtin s = diff --git a/src/kernel_services/ast_queries/cil_builtins.mli b/src/kernel_services/ast_queries/cil_builtins.mli index 76902c6d59284cabc83ad806c5063dbe5fae9265..45b02173c47744a19146fab35cc6eff13c84dbf8 100644 --- a/src/kernel_services/ast_queries/cil_builtins.mli +++ b/src/kernel_services/ast_queries/cil_builtins.mli @@ -57,9 +57,14 @@ module Frama_c_builtins: State_builder.Hashtbl with type key = string and type data = varinfo val is_builtin: varinfo -> bool -(** @return true if the given variable refers to a Frama-C builtin. +(** @return true if {!has_fc_builtin_attr} or {!is_special_builtin} are true. + @before Frama-C+dev Only check for {!has_fc_builtin_attr}. @since Fluorine-20130401 *) +val has_fc_builtin_attr: varinfo -> bool +(** @return true if the given variable has a FC_BUILTIN attribute + @since Frama-C+dev *) + val is_unused_builtin: varinfo -> bool (** @return true if the given variable refers to a Frama-C builtin that is not used in the current program. Plugins may (and in fact should) diff --git a/src/kernel_services/ast_queries/filecheck.ml b/src/kernel_services/ast_queries/filecheck.ml index 262a40268e873206e5d593f5b673c4280092ad51..891a2394b1970e1e017adeed3274f822dcfcaea6 100644 --- a/src/kernel_services/ast_queries/filecheck.ml +++ b/src/kernel_services/ast_queries/filecheck.ml @@ -177,7 +177,7 @@ module Base_checker = struct let unknown () = check_abort "variable %s(%d) is not declared" v.vname v.vid in - if not v.vglob || not (Ast_info.is_frama_c_builtin v.vname) then + if not v.vglob || not (Ast_info.start_with_frama_c_builtin v.vname) then (try if Varinfo.Hashtbl.find known_vars v != v then not_shared () with Not_found -> unknown () diff --git a/src/plugins/e-acsl/src/libraries/misc.ml b/src/plugins/e-acsl/src/libraries/misc.ml index f7c2936976227b7b12cf90bf734420948c2cbd8a..7b03b13df7d378e548a91f90d82582817b14e24e 100644 --- a/src/plugins/e-acsl/src/libraries/misc.ml +++ b/src/plugins/e-acsl/src/libraries/misc.ml @@ -27,7 +27,7 @@ open Cil_types (* ************************************************************************** *) let is_fc_or_compiler_builtin vi = - Cil_builtins.is_builtin vi + Cil_builtins.has_fc_builtin_attr vi || (let prefix_length = 10 (* number of characters in "__builtin_" *) in String.length vi.vname > prefix_length diff --git a/src/plugins/eva/engine/function_calls.ml b/src/plugins/eva/engine/function_calls.ml index ee88bbdc58569980f49e7cbca5c5c539ca06cdeb..5b8cd029a76e9302b0b46e434645ee209704b11d 100644 --- a/src/plugins/eva/engine/function_calls.ml +++ b/src/plugins/eva/engine/function_calls.ml @@ -146,7 +146,7 @@ let analysis_status kf = (* Must be consistent with the choice made by [analysis_target] below. *) let use_spec_instead_of_definition ?(recursion_depth = -1) kf = - Ast_info.is_frama_c_builtin (Kernel_function.get_name kf) || + Ast_info.start_with_frama_c_builtin (Kernel_function.get_name kf) || Builtins.is_builtin_overridden kf || recursion_depth >= Parameters.RecursiveUnroll.get () || not (Kernel_function.is_definition kf) || diff --git a/src/plugins/eva/engine/transfer_stmt.ml b/src/plugins/eva/engine/transfer_stmt.ml index 1bb0994dc6e1d37e40f2327b477b4a1df71ad98a..34a7b67ef1f8590dd7a6a5ea37dc447b8ca7104e 100644 --- a/src/plugins/eva/engine/transfer_stmt.ml +++ b/src/plugins/eva/engine/transfer_stmt.ml @@ -85,7 +85,7 @@ let do_copy_at = function let is_determinate kf = let name = Kernel_function.get_name kf in (warn_indeterminate kf || Function_calls.use_spec_instead_of_definition kf) - && not (Ast_info.is_frama_c_builtin name) + && not (Ast_info.start_with_frama_c_builtin name) let subdivide_stmt = Eva_utils.get_subdivision @@ -708,15 +708,15 @@ module Make (Abstract: Abstractions.S_with_evaluation) = struct (** Applies the show_each or dump_each directives. *) let apply_special_directives ~subdivnb kf arguments state = let name = Kernel_function.get_name kf in - if Ast_info.can_be_cea_function name + if Ast_info.start_with_frama_c name then - if Ast_info.is_cea_function name + if Ast_info.is_show_each_builtin name then (show_each ~subdivnb name arguments state; true) - else if Ast_info.is_cea_domain_function name + else if Ast_info.is_domain_show_each_builtin name then (domain_show_each ~subdivnb name arguments state; true) - else if Ast_info.is_cea_dump_file_function name + else if Ast_info.is_dump_file_builtin name then (dump_state_file ~subdivnb name arguments state; true) - else if Ast_info.is_cea_dump_function name + else if Ast_info.is_dump_each_builtin name then (dump_state name state; true) else false else false diff --git a/src/plugins/eva/partitioning/auto_loop_unroll.ml b/src/plugins/eva/partitioning/auto_loop_unroll.ml index 58b52807752271e0a9c58bb69d832deeb6f78844..fca0c44ebc07734543e871f4d45fa8be744cf173 100644 --- a/src/plugins/eva/partitioning/auto_loop_unroll.ml +++ b/src/plugins/eva/partitioning/auto_loop_unroll.ml @@ -177,7 +177,7 @@ let add_written_var vi effect = let is_frama_c_builtin exp = match exp.enode with - | Lval (Var vi, NoOffset) -> Ast_info.is_frama_c_builtin vi.vname + | Lval (Var vi, NoOffset) -> Ast_info.start_with_frama_c_builtin vi.vname | _ -> false let compute_instr_effect effect = function diff --git a/src/plugins/eva/utils/summary.ml b/src/plugins/eva/utils/summary.ml index b168b19625124b901ddcf2b86c184e9d0ee1c13f..6982ec1bfeef2b3ad812871677fbe05e8d79fc86 100644 --- a/src/plugins/eva/utils/summary.ml +++ b/src/plugins/eva/utils/summary.ml @@ -225,9 +225,7 @@ end let consider_function vi = vi.Cil_types.vdefined && - not (Cil_builtins.is_builtin vi - || Cil_builtins.is_special_builtin vi.vname - || Cil.is_in_libc vi.vattr) + not (Cil_builtins.is_builtin vi || Cil.is_in_libc vi.vattr) let compute_events () = let eva = Events.make () and kernel = Events.make () in diff --git a/src/plugins/from/from_compute.ml b/src/plugins/from/from_compute.ml index 4060d0d518378c27d35ebfd9724579e3e3f6354a..4c662872580ba2732f0583f403dda70ffe646c7a 100644 --- a/src/plugins/from/from_compute.ml +++ b/src/plugins/from/from_compute.ml @@ -346,7 +346,7 @@ struct let states_with_formals = ref [] in let do_on kf = let called_vinfo = Kernel_function.get_vi kf in - if Ast_info.is_frama_c_builtin called_vinfo.vname then + if Ast_info.start_with_frama_c_builtin called_vinfo.vname then state else let froms_call = To_Use.get_from_call kf stmt in diff --git a/src/plugins/gui/property_navigator.ml b/src/plugins/gui/property_navigator.ml index 3f874465f59b47884281ad734ce6e00f19b98259..a873fdbf6f894e4b03faea6bdaded41d0c61d0da 100644 --- a/src/plugins/gui/property_navigator.ml +++ b/src/plugins/gui/property_navigator.ml @@ -43,7 +43,7 @@ let all_properties () = match Property.get_kf ip with | None -> globals := Property.Set.add ip !globals | Some kf -> - if not (Ast_info.is_frama_c_builtin (Kernel_function.get_name kf)) + if not (Ast_info.start_with_frama_c_builtin (Kernel_function.get_name kf)) then try let fips = Kernel_function.Map.find kf !functions in fips := Property.Set.add ip !fips diff --git a/src/plugins/metrics/metrics_base.ml b/src/plugins/metrics/metrics_base.ml index b20821d6b8dfc2fbdccfbd0c2ecfa44a9f66d9df..777bce0fd9b012002a2b9da61bb378a01dad7207 100644 --- a/src/plugins/metrics/metrics_base.ml +++ b/src/plugins/metrics/metrics_base.ml @@ -367,7 +367,7 @@ let get_filename fdef = let consider_function ~libc vinfo = not (Eva.Builtins.is_builtin vinfo.vname - || Ast_info.is_frama_c_builtin vinfo.vname + || Ast_info.start_with_frama_c_builtin vinfo.vname || Cil_builtins.is_unused_builtin vinfo ) && (libc || not (Cil.is_in_libc vinfo.vattr)) diff --git a/src/plugins/obfuscator/obfuscate.ml b/src/plugins/obfuscator/obfuscate.ml index 777b2cfc05de6807ce65cbb9c2cf59d58de36fa2..fba8a49e215abae7019981c079bb1fca1763026a 100644 --- a/src/plugins/obfuscator/obfuscate.ml +++ b/src/plugins/obfuscator/obfuscate.ml @@ -102,7 +102,6 @@ class visitor = object if Cil.isFunctionType vi.vtype then begin if vi.vname <> "main" && not (Cil_builtins.is_builtin vi) - && not (Cil_builtins.is_special_builtin vi.vname) && not (Cil.is_in_libc vi.vattr) then vi.vname <- Dictionary.fresh Obfuscator_kind.Function vi.vname end diff --git a/src/plugins/report/scan.ml b/src/plugins/report/scan.ml index 522d3376dddb4c87dfd1fcf7be3625996a5b3c4c..e7c28026e6a13de377f8e617906f036c57b8399a 100644 --- a/src/plugins/report/scan.ml +++ b/src/plugins/report/scan.ml @@ -126,7 +126,7 @@ let iter (inspector:inspector) = match Property.get_kf ip with | None -> globals := Property.Set.add ip !globals | Some kf -> - if not (Ast_info.is_frama_c_builtin (Kernel_function.get_name kf)) + if not (Ast_info.start_with_frama_c_builtin (Kernel_function.get_name kf)) then try let fips = Kernel_function.Map.find kf !functions in fips := Property.Set.add ip !fips diff --git a/src/plugins/rte/visit.ml b/src/plugins/rte/visit.ml index 02f8d10d536283f588b0daca43e8f97a0aa45050..c92bf683b585155d67ef88c99292989ecde548e7 100644 --- a/src/plugins/rte/visit.ml +++ b/src/plugins/rte/visit.ml @@ -170,7 +170,7 @@ class annot_visitor kf flags on_alarm = object (self) match funcexp.enode with | Lval (Var vinfo, NoOffset) -> let kf = Globals.Functions.get vinfo in - let frama_b = Ast_info.is_frama_c_builtin (Kernel_function.get_name kf) + let frama_b = Ast_info.start_with_frama_c_builtin (Kernel_function.get_name kf) in let va_start = Kernel_function.get_name kf = "__builtin_va_start" in (frama_b, va_start) diff --git a/src/plugins/server/kernel_ast.ml b/src/plugins/server/kernel_ast.ml index 46a17d9e1422e7e5d1569cf3da7cf30b5291bd8f..5e9c740f8e09959a733ce577ef7665e949604caf 100644 --- a/src/plugins/server/kernel_ast.ml +++ b/src/plugins/server/kernel_ast.ml @@ -608,7 +608,7 @@ struct if not libc then Kernel.PrintLibc.set false ; raise err let is_builtin kf = - Cil_builtins.is_builtin (Kernel_function.get_vi kf) + Cil_builtins.has_fc_builtin_attr (Kernel_function.get_vi kf) let is_extern kf = let vi = Kernel_function.get_vi kf in @@ -618,7 +618,7 @@ struct Globals.Functions.iter (fun kf -> let name = Kernel_function.get_name kf in - if not (Ast_info.is_frama_c_builtin name) then f kf) + if not (Ast_info.start_with_frama_c_builtin name) then f kf) let array : kernel_function States.array = begin diff --git a/src/plugins/server/kernel_properties.ml b/src/plugins/server/kernel_properties.ml index 57d3d0305f4bfaa0aaf686adb88ccdae1f3d18ba..b7e821e4906a83172ef293c0de6fd5a6b36723eb 100644 --- a/src/plugins/server/kernel_properties.ml +++ b/src/plugins/server/kernel_properties.ml @@ -308,7 +308,7 @@ let is_relevant ip = match Property.get_kf ip with | None -> true | Some kf -> - not (Ast_info.is_frama_c_builtin (Kernel_function.get_name kf) + not (Ast_info.start_with_frama_c_builtin (Kernel_function.get_name kf) || Cil_builtins.is_unused_builtin (Kernel_function.get_vi kf)) let iter f = diff --git a/src/plugins/variadic/classify.ml b/src/plugins/variadic/classify.ml index 32d4c8c2c3690afd523cc768515874f2ba7813f3..7717ee908379ed0e830a06ec4b92ec6be8d108d2 100644 --- a/src/plugins/variadic/classify.ml +++ b/src/plugins/variadic/classify.ml @@ -111,7 +111,7 @@ let mk_format_fun vi f_kind f_buffer ~format_pos = (* ************************************************************************ *) let is_frama_c_builtin name = - Ast_info.is_frama_c_builtin name || + Ast_info.start_with_frama_c_builtin name || Cil_builtins.Builtin_functions.mem name || String.starts_with ~prefix:"__FRAMAC_" name (* Mthread prefixes *) diff --git a/src/plugins/wp/RefUsage.ml b/src/plugins/wp/RefUsage.ml index 13e0908d44a34f390fda0e5077b8266c8eea746a..b6956f0222f7088bb574c59cfee988e77121b4bd 100644 --- a/src/plugins/wp/RefUsage.ml +++ b/src/plugins/wp/RefUsage.ml @@ -681,8 +681,6 @@ let cfun_spec env kf = let cfun kf = let env = mk_ctx () in - (* Skipping frama-c builtins? - if not (Cil_builtins.is_builtin (Kernel_function.get_vi kf)) then *) begin if Kernel_function.is_definition kf then cfun_code env kf ; cfun_spec env kf @@ -915,7 +913,7 @@ let dump () = in Format.fprintf fmt "@[<hv 0>Init:@ %a@]@." E.pretty a_init ; KFmap.iter (fun kf m -> (* Do not dump results for frama-c builtins *) - if not (Cil_builtins.is_builtin (Kernel_function.get_vi kf)) then + if not (Cil_builtins.has_fc_builtin_attr (Kernel_function.get_vi kf)) then Format.fprintf fmt "@[<hv 0>Function %a:@ %a@]@." Kernel_function.pretty kf E.pretty m ; ) a_usage; diff --git a/tests/misc/bts1347.ml b/tests/misc/bts1347.ml index b89b9009d34d9dc3f4a9b9fbecf6593eb6a3aca6..71eab2c4a2a414f9abe38e41eb366d5aa1169c78 100644 --- a/tests/misc/bts1347.ml +++ b/tests/misc/bts1347.ml @@ -5,7 +5,7 @@ let emitter = let run () = Globals.Functions.iter (fun kf -> - if not (Cil_builtins.is_builtin (Kernel_function.get_vi kf)) then begin + if not (Cil_builtins.has_fc_builtin_attr (Kernel_function.get_vi kf)) then begin Globals.set_entry_point (Kernel_function.get_name kf) true; Eva.Analysis.compute(); let hyps =