diff --git a/infer/src/clang/cFrontend_errors.ml b/infer/src/clang/cFrontend_errors.ml index 063ccdb89..fae30e18a 100644 --- a/infer/src/clang/cFrontend_errors.ml +++ b/infer/src/clang/cFrontend_errors.ml @@ -11,24 +11,34 @@ open! IStd open CFrontend_utils +let single_to_multi checker = + fun ctx an -> + let condition, issue_desc_opt = checker ctx an in + (condition, Option.to_list issue_desc_opt) + +(* List of checkers on decls *that return 0 or 1 issue* *) +let decl_single_checkers_list = [CFrontend_checkers.ctl_strong_delegate_warning; + CFrontend_checkers.ctl_assign_pointer_warning; + CFrontend_checkers.ctl_ns_notification_warning; + CFrontend_checkers.ctl_global_var_init_with_calls_warning; + ComponentKit.component_with_unconventional_superclass_advice; + ComponentKit.mutable_local_vars_advice; + ComponentKit.component_factory_function_advice; + ComponentKit.component_file_cyclomatic_complexity_info; + ComponentKit.component_with_multiple_factory_methods_advice;] + (* List of checkers on decls *) -let decl_checkers_list = [CFrontend_checkers.ctl_strong_delegate_warning; - CFrontend_checkers.ctl_assign_pointer_warning; - CFrontend_checkers.ctl_ns_notification_warning; - CFrontend_checkers.ctl_global_var_init_with_calls_warning; - ComponentKit.component_with_unconventional_superclass_advice; - ComponentKit.mutable_local_vars_advice; - ComponentKit.component_factory_function_advice; - ComponentKit.component_file_cyclomatic_complexity_info; - ComponentKit.component_with_multiple_factory_methods_advice;] - -(* List of checkers on stmts *) -let stmt_checkers_list = [CFrontend_checkers.ctl_direct_atomic_property_access_warning; - CFrontend_checkers.ctl_captured_cxx_ref_in_objc_block_warning; - CFrontend_checkers.ctl_bad_pointer_comparison_warning; - ComponentKit.component_file_cyclomatic_complexity_info; - ComponentKit.component_initializer_with_side_effects_advice; - CFrontend_checkers.ctl_unavailable_api_in_supported_ios_sdk_error;] +let decl_checkers_list = IList.map single_to_multi decl_single_checkers_list + +(* List of checkers on stmts *that return 0 or 1 issue* *) +let stmt_single_checkers_list = [CFrontend_checkers.ctl_direct_atomic_property_access_warning; + CFrontend_checkers.ctl_captured_cxx_ref_in_objc_block_warning; + CFrontend_checkers.ctl_bad_pointer_comparison_warning; + ComponentKit.component_file_cyclomatic_complexity_info; + ComponentKit.component_initializer_with_side_effects_advice; + CFrontend_checkers.ctl_unavailable_api_in_supported_ios_sdk_error;] + +let stmt_checkers_list = IList.map single_to_multi stmt_single_checkers_list (* List of checkers on translation unit that potentially output multiple issues *) let translation_unit_checkers_list = [ComponentKit.component_file_line_count_info;] @@ -142,16 +152,16 @@ let invoke_set_of_checkers_an an context = | CTL.Decl dec -> decl_checkers_list, Ast_utils.generate_key_decl dec | CTL.Stmt st -> stmt_checkers_list, Ast_utils.generate_key_stmt st in IList.iter (fun checker -> - let condition, issue_desc_opt = checker context an in - match issue_desc_opt with - | Some issue_desc -> - if CIssue.should_run_check issue_desc.CIssue.mode && - CTL.eval_formula condition an context then - let desc' = expand_message_string issue_desc.CIssue.description an in - let issue_desc' = {issue_desc with CIssue.description = desc'} in - log_frontend_issue context.CLintersContext.translation_unit_context - context.CLintersContext.current_method key issue_desc' - | None -> ()) checkers + let condition, issue_desc_list = checker context an in + if CTL.eval_formula condition an context then + IList.iter (fun issue_desc -> + if CIssue.should_run_check issue_desc.CIssue.mode then + let desc' = expand_message_string issue_desc.CIssue.description an in + let issue_desc' = {issue_desc with CIssue.description = desc'} in + log_frontend_issue context.CLintersContext.translation_unit_context + context.CLintersContext.current_method key issue_desc' + ) issue_desc_list + ) checkers let run_frontend_checkers_on_an (context: CLintersContext.context) an =