diff --git a/infer/src/IR/Exceptions.ml b/infer/src/IR/Exceptions.ml index 5f9272f89..e846db96d 100644 --- a/infer/src/IR/Exceptions.ml +++ b/infer/src/IR/Exceptions.ml @@ -79,7 +79,8 @@ exception Eradicate of IssueType.t * Localise.error_desc exception Field_not_null_checked of Localise.error_desc * L.ocaml_pos exception - Frontend_warning of (string * string option * string option) * Localise.error_desc * L.ocaml_pos + Frontend_warning of + (string * string option * string option * string option) * Localise.error_desc * L.ocaml_pos exception Checkers of IssueType.t * Localise.error_desc @@ -321,8 +322,8 @@ let recognize_exception exn = ; visibility= Exn_user ; severity= Some Warning ; category= Nocat } - | Frontend_warning ((name, hum, doc_url), desc, ocaml_pos) -> - { name= IssueType.from_string name ?hum ?doc_url + | Frontend_warning ((name, hum, doc_url, linters_def_file), desc, ocaml_pos) -> + { name= IssueType.from_string name ?hum ?doc_url ?linters_def_file ; description= desc ; ocaml_pos= Some ocaml_pos ; visibility= Exn_user diff --git a/infer/src/IR/Exceptions.mli b/infer/src/IR/Exceptions.mli index b407168e0..06a6b80ee 100644 --- a/infer/src/IR/Exceptions.mli +++ b/infer/src/IR/Exceptions.mli @@ -81,7 +81,9 @@ exception Checkers of IssueType.t * Localise.error_desc exception Frontend_warning of - (string * string option * string option) * Localise.error_desc * Logging.ocaml_pos + (string * string option * string option * string option) + * Localise.error_desc + * Logging.ocaml_pos exception Inherently_dangerous_function of Localise.error_desc diff --git a/infer/src/backend/reporting.ml b/infer/src/backend/reporting.ml index b75326f68..68464ea9e 100644 --- a/infer/src/backend/reporting.ml +++ b/infer/src/backend/reporting.ml @@ -8,31 +8,25 @@ open! IStd module L = Logging -type log_t = - ?ltr:Errlog.loc_trace - -> ?linters_def_file:string - -> ?access:string - -> ?extras:Jsonbug_t.extra - -> exn - -> unit +type log_t = ?ltr:Errlog.loc_trace -> ?access:string -> ?extras:Jsonbug_t.extra -> exn -> unit let log_issue_from_errlog procname ~clang_method_kind severity err_log ~loc ~node ~session ~ltr - ~linters_def_file ~access ~extras exn = + ~access ~extras exn = let issue_type = (Exceptions.recognize_exception exn).name in if (not Config.filtering) (* no-filtering takes priority *) || issue_type.IssueType.enabled then let doc_url = issue_type.doc_url in + let linters_def_file = issue_type.linters_def_file in Errlog.log_issue procname ~clang_method_kind severity err_log ~loc ~node ~session ~ltr ~linters_def_file ~doc_url ~access ~extras exn -let log_frontend_issue procname severity errlog ~loc ~node_key ~ltr ~linters_def_file exn = +let log_frontend_issue procname severity errlog ~loc ~node_key ~ltr exn = let node = Errlog.FrontendNode {node_key} in log_issue_from_errlog procname ~clang_method_kind:None severity errlog ~loc ~node ~session:0 ~ltr - ~linters_def_file ~access:None ~extras:None exn + ~access:None ~extras:None exn -let log_issue_from_summary severity summary ~node ~session ~loc ~ltr ?linters_def_file ?access - ?extras exn = +let log_issue_from_summary severity summary ~node ~session ~loc ~ltr ?access ?extras exn = let attrs = Summary.get_attributes summary in let procname = attrs.proc_name in let is_java_generated_method = @@ -52,7 +46,7 @@ let log_issue_from_summary severity summary ~node ~session ~loc ~ltr ?linters_de let err_log = Summary.get_err_log summary in let clang_method_kind = Some attrs.clang_method_kind in log_issue_from_errlog procname ~clang_method_kind severity err_log ~loc ~node ~session ~ltr - ~linters_def_file ~access ~extras exn + ~access ~extras exn let log_issue_deprecated_using_state severity proc_name ?node ?loc ?ltr exn = @@ -73,10 +67,9 @@ let log_issue_deprecated_using_state severity proc_name ?node ?loc ?ltr exn = Typ.Procname.pp proc_name Typ.Procname.pp proc_name -let log_issue_from_summary_simplified severity summary ~loc ?(ltr = []) ?linters_def_file ?access - ?extras exn = - log_issue_from_summary severity summary ~node:Errlog.UnknownNode ~session:0 ~loc ~ltr - ?linters_def_file ?access ?extras exn +let log_issue_from_summary_simplified severity summary ~loc ?(ltr = []) ?access ?extras exn = + log_issue_from_summary severity summary ~node:Errlog.UnknownNode ~session:0 ~loc ~ltr ?access + ?extras exn let log_error = log_issue_from_summary_simplified Exceptions.Error @@ -88,7 +81,7 @@ let log_issue_external procname severity ~loc ~ltr ?access issue_type error_mess let errlog = IssueLog.get_errlog procname in let node = Errlog.UnknownNode in log_issue_from_errlog procname ~clang_method_kind:None severity errlog ~loc ~node ~session:0 ~ltr - ~linters_def_file:None ~access ~extras:None exn + ~access ~extras:None exn let log_error_using_state summary exn = @@ -96,8 +89,7 @@ let log_error_using_state summary exn = let session = State.get_session () in let loc = State.get_loc () in let ltr = State.get_loc_trace () in - log_issue_from_summary Exceptions.Error summary ~node ~session ~loc ~ltr ?linters_def_file:None - ?access:None exn + log_issue_from_summary Exceptions.Error summary ~node ~session ~loc ~ltr ?access:None exn let is_suppressed ?(field_name = None) tenv proc_desc kind = diff --git a/infer/src/backend/reporting.mli b/infer/src/backend/reporting.mli index 0dfffb3f9..8a8188400 100644 --- a/infer/src/backend/reporting.mli +++ b/infer/src/backend/reporting.mli @@ -9,13 +9,7 @@ open! IStd (** Type of functions to report issues to the error_log in a spec. *) -type log_t = - ?ltr:Errlog.loc_trace - -> ?linters_def_file:string - -> ?access:string - -> ?extras:Jsonbug_t.extra - -> exn - -> unit +type log_t = ?ltr:Errlog.loc_trace -> ?access:string -> ?extras:Jsonbug_t.extra -> exn -> unit val log_issue_deprecated_using_state : Exceptions.severity @@ -36,7 +30,6 @@ val log_frontend_issue : -> loc:Location.t -> node_key:Procdesc.NodeKey.t -> ltr:Errlog.loc_trace - -> linters_def_file:string option -> exn -> unit (** Report a frontend issue of a given kind in the given error log. *) diff --git a/infer/src/base/IssueType.ml b/infer/src/base/IssueType.ml index 5e28ee9ed..271b799f6 100644 --- a/infer/src/base/IssueType.ml +++ b/infer/src/base/IssueType.ml @@ -10,12 +10,17 @@ open! IStd we want to keep track of the list of all the issues ever declared. *) module Unsafe : sig type t = private - {unique_id: string; mutable enabled: bool; mutable hum: string; mutable doc_url: string option} + { unique_id: string + ; mutable enabled: bool + ; mutable hum: string + ; mutable doc_url: string option + ; mutable linters_def_file: string option } [@@deriving compare] val equal : t -> t -> bool - val from_string : ?enabled:bool -> ?hum:string -> ?doc_url:string -> string -> t + val from_string : + ?enabled:bool -> ?hum:string -> ?doc_url:string -> ?linters_def_file:string -> string -> t val all_issues : unit -> t list @@ -26,7 +31,8 @@ end = struct { unique_id: string ; mutable enabled: bool ; mutable hum: string - ; mutable doc_url: string option } + ; mutable doc_url: string option + ; mutable linters_def_file: string option } let compare {unique_id= id1} {unique_id= id2} = String.compare id1 id2 @@ -56,15 +62,16 @@ end = struct 2., but issues of type 2. have not yet been defined. Thus, we record only there [enabled] status definitely. The [hum]an-readable description can be updated when we encounter the definition of the issue type, eg in AL. *) - let from_string ?(enabled = true) ?hum:hum0 ?doc_url unique_id = + let from_string ?(enabled = true) ?hum:hum0 ?doc_url ?linters_def_file unique_id = let hum = match hum0 with Some str -> str | _ -> prettify unique_id in - let issue = {unique_id; enabled; hum; doc_url} in + let issue = {unique_id; enabled; hum; doc_url; linters_def_file} in try let old = IssueSet.find issue !all_issues in (* update human-readable string in case it was supplied this time, but keep the previous value of enabled (see doc comment) *) if Option.is_some hum0 then old.hum <- hum ; if Option.is_some doc_url then old.doc_url <- doc_url ; + if Option.is_some linters_def_file then old.linters_def_file <- linters_def_file ; old with Caml.Not_found -> all_issues := IssueSet.add issue !all_issues ; diff --git a/infer/src/base/IssueType.mli b/infer/src/base/IssueType.mli index 764af9985..37e62ce5a 100644 --- a/infer/src/base/IssueType.mli +++ b/infer/src/base/IssueType.mli @@ -9,7 +9,11 @@ open! IStd (** type of string used for localisation *) type t = private - {unique_id: string; mutable enabled: bool; mutable hum: string; mutable doc_url: string option} + { unique_id: string + ; mutable enabled: bool + ; mutable hum: string + ; mutable doc_url: string option + ; mutable linters_def_file: string option } [@@deriving compare] val equal : t -> t -> bool @@ -20,7 +24,8 @@ val all_issues : unit -> t list val pp : Format.formatter -> t -> unit (** pretty print a localised string *) -val from_string : ?enabled:bool -> ?hum:string -> ?doc_url:string -> string -> t +val from_string : + ?enabled:bool -> ?hum:string -> ?doc_url:string -> ?linters_def_file:string -> string -> t (** create from an ordinary string *) val set_enabled : t -> bool -> unit diff --git a/infer/src/clang/cFrontend_errors.ml b/infer/src/clang/cFrontend_errors.ml index d8730e1dc..037935e18 100644 --- a/infer/src/clang/cFrontend_errors.ml +++ b/infer/src/clang/cFrontend_errors.ml @@ -446,7 +446,7 @@ let log_frontend_issue method_decl_opt (node : Ctl_parser_types.ast_node) in let exn = Exceptions.Frontend_warning - ((issue_desc.id, issue_desc.name, issue_desc.doc_url), err_desc, __POS__) + ((issue_desc.id, issue_desc.name, issue_desc.doc_url, linters_def_file), err_desc, __POS__) in let trace = [Errlog.make_trace_element 0 issue_desc.loc "" []] in let key_str = @@ -458,7 +458,7 @@ let log_frontend_issue method_decl_opt (node : Ctl_parser_types.ast_node) in let node_key = Procdesc.NodeKey.of_frontend_node_key key_str in Reporting.log_frontend_issue procname issue_desc.severity errlog exn ~loc:issue_desc.loc - ~ltr:trace ~node_key ~linters_def_file + ~ltr:trace ~node_key let fill_issue_desc_info_and_log context ~witness ~current_node (issue_desc : CIssue.issue_desc)