diff --git a/infer/man/man1/infer-capture.txt b/infer/man/man1/infer-capture.txt index c15354c47..0aafd8154 100644 --- a/infer/man/man1/infer-capture.txt +++ b/infer/man/man1/infer-capture.txt @@ -196,6 +196,14 @@ CLANG OPTIONS --clang-biniou-file file Specify a file containing the AST of the program, in biniou format + --clang-blacklisted-flags +string + Clang flags to filter out (default: + --expt-relaxed-constexpr,-fembed-bitcode-marker,-fno-absolute-module-directory,-fno-canonical-system-headers) + + --clang-blacklisted-flags-with-arg +string + Clang flags (taking args) to filter out (default: + -index-store-path,-mllvm) + --compilation-database +path File that contain compilation commands (can be specified multiple times) diff --git a/infer/man/man1/infer-full.txt b/infer/man/man1/infer-full.txt index c3009b0db..07f21b272 100644 --- a/infer/man/man1/infer-full.txt +++ b/infer/man/man1/infer-full.txt @@ -172,6 +172,15 @@ OPTIONS Specify a file containing the AST of the program, in biniou format See also infer-capture(1). + --clang-blacklisted-flags +string + Clang flags to filter out (default: + --expt-relaxed-constexpr,-fembed-bitcode-marker,-fno-absolute-module-directory,-fno-canonical-system-headers) + See also infer-capture(1). + + --clang-blacklisted-flags-with-arg +string + Clang flags (taking args) to filter out (default: + -index-store-path,-mllvm) See also infer-capture(1). + --class-loads Activates: Java class loading analysis (Conversely: --no-class-loads) See also infer-analyze(1). @@ -1178,6 +1187,12 @@ INTERNAL OPTIONS --clang-biniou-file-reset Cancel the effect of --clang-biniou-file. + --clang-blacklisted-flags-reset + Set --clang-blacklisted-flags to the empty list. + + --clang-blacklisted-flags-with-arg-reset + Set --clang-blacklisted-flags-with-arg to the empty list. + --clang-ignore-regex dir_OCaml_regex The files in this regex will be ignored in the compilation process and an empty file will be passed to clang instead. This is to be diff --git a/infer/man/man1/infer.txt b/infer/man/man1/infer.txt index b7022ea5a..c072f899f 100644 --- a/infer/man/man1/infer.txt +++ b/infer/man/man1/infer.txt @@ -172,6 +172,15 @@ OPTIONS Specify a file containing the AST of the program, in biniou format See also infer-capture(1). + --clang-blacklisted-flags +string + Clang flags to filter out (default: + --expt-relaxed-constexpr,-fembed-bitcode-marker,-fno-absolute-module-directory,-fno-canonical-system-headers) + See also infer-capture(1). + + --clang-blacklisted-flags-with-arg +string + Clang flags (taking args) to filter out (default: + -index-store-path,-mllvm) See also infer-capture(1). + --class-loads Activates: Java class loading analysis (Conversely: --no-class-loads) See also infer-analyze(1). diff --git a/infer/src/base/Config.ml b/infer/src/base/Config.ml index 2fc275f41..d1a7cd0f5 100644 --- a/infer/src/base/Config.ml +++ b/infer/src/base/Config.ml @@ -905,6 +905,24 @@ and clang_extra_flags = "Pass values as command-line arguments to invocations of clang" +and clang_blacklisted_flags = + CLOpt.mk_string_list ~long:"clang-blacklisted-flags" + ~default: + [ "--expt-relaxed-constexpr" + ; "-fembed-bitcode-marker" + ; "-fno-absolute-module-directory" + ; "-fno-canonical-system-headers" ] + ~in_help:InferCommand.[(Capture, manual_clang)] + "Clang flags to filter out" + + +and clang_blacklisted_flags_with_arg = + CLOpt.mk_string_list ~long:"clang-blacklisted-flags-with-arg" + ~default:["-index-store-path"; "-mllvm"] + ~in_help:InferCommand.[(Capture, manual_clang)] + "Clang flags (taking args) to filter out" + + and clang_compilation_dbs = ref [] and clang_frontend_action = @@ -2658,6 +2676,10 @@ and clang_biniou_file = !clang_biniou_file and clang_extra_flags = !clang_extra_flags +and clang_blacklisted_flags = !clang_blacklisted_flags + +and clang_blacklisted_flags_with_arg = !clang_blacklisted_flags_with_arg + and clang_ignore_regex = !clang_ignore_regex and clang_isystem_to_override_regex = !clang_isystem_to_override_regex diff --git a/infer/src/base/Config.mli b/infer/src/base/Config.mli index 9177bb470..fdd84df62 100644 --- a/infer/src/base/Config.mli +++ b/infer/src/base/Config.mli @@ -276,6 +276,10 @@ val clang_biniou_file : string option val clang_extra_flags : string list +val clang_blacklisted_flags : string list + +val clang_blacklisted_flags_with_arg : string list + val clang_frontend_action_string : string val clang_ignore_regex : string option diff --git a/infer/src/clang/ClangCommand.ml b/infer/src/clang/ClangCommand.ml index 4f20a797f..2b7405f95 100644 --- a/infer/src/clang/ClangCommand.ml +++ b/infer/src/clang/ClangCommand.ml @@ -15,14 +15,6 @@ type t = ; quoting_style: ClangQuotes.style ; is_driver: bool } -(** bad for every clang invocation *) -let clang_blacklisted_flags = - [ "--expt-relaxed-constexpr" - ; "-fembed-bitcode-marker" - ; "-fno-absolute-module-directory" - ; "-fno-canonical-system-headers" ] - - let fcp_dir = Config.bin_dir ^/ Filename.parent_dir_name ^/ Filename.parent_dir_name ^/ "facebook-clang-plugins" @@ -92,8 +84,8 @@ let libcxx_include_to_override_regex = (** Filter arguments from [args], looking into argfiles too. [replace_options_arg prev arg] returns [arg'], where [arg'] is the new version of [arg] given the preceding arguments (in reverse order) [prev]. *) -let filter_and_replace_unsupported_args ?(replace_options_arg = fun _ s -> s) - ?(blacklisted_flags = []) ?(blacklisted_flags_with_arg = []) ?(post_args = []) args = +let filter_and_replace_unsupported_args ?(replace_options_arg = fun _ s -> s) ?(post_args = []) + args = (* [prev] is the previously seen argument, [res_rev] is the reversed result, [changed] is true if some change has been performed *) let rec aux in_argfiles (prev_is_blacklisted_with_arg, res_rev, changed) args = @@ -130,9 +122,9 @@ let filter_and_replace_unsupported_args ?(replace_options_arg = fun _ s -> s) L.external_warning "Error reading argument file '%s': %s@\n" at_argfile (Exn.to_string e) ; aux in_argfiles' (false, at_argfile :: res_rev, changed) tl ) - | flag :: tl when List.mem ~equal:String.equal blacklisted_flags flag -> + | flag :: tl when List.mem ~equal:String.equal Config.clang_blacklisted_flags flag -> aux in_argfiles (false, res_rev, true) tl - | flag :: tl when List.mem ~equal:String.equal blacklisted_flags_with_arg flag -> + | flag :: tl when List.mem ~equal:String.equal Config.clang_blacklisted_flags_with_arg flag -> (* remove the flag and its arg separately in case we are at the end of an argfile *) aux in_argfiles (true, res_rev, true) tl | arg :: tl -> @@ -150,7 +142,6 @@ let filter_and_replace_unsupported_args ?(replace_options_arg = fun _ s -> s) fatal warnings. *) let clang_cc1_cmd_sanitizer cmd = (* command line options not supported by the opensource compiler or the plugins *) - let blacklisted_flags_with_arg = ["-mllvm"] in let replace_options_arg options arg = match (options, arg) with | [], _ -> @@ -194,19 +185,15 @@ let clang_cc1_cmd_sanitizer cmd = argv_cons "-Wno-everything" in let clang_arguments = - filter_and_replace_unsupported_args ~blacklisted_flags:clang_blacklisted_flags - ~blacklisted_flags_with_arg ~replace_options_arg ~post_args:(List.rev post_args_rev) cmd.argv + filter_and_replace_unsupported_args ~replace_options_arg ~post_args:(List.rev post_args_rev) + cmd.argv in file_arg_cmd_sanitizer {cmd with argv= clang_arguments} let mk ~is_driver quoting_style ~prog ~args = (* Some arguments break the compiler so they need to be removed even before the normalization step *) - let blacklisted_flags_with_arg = ["-index-store-path"] in - let sanitized_args = - filter_and_replace_unsupported_args ~blacklisted_flags:clang_blacklisted_flags - ~blacklisted_flags_with_arg args - in + let sanitized_args = filter_and_replace_unsupported_args args in let sanitized_args = if is_driver then sanitized_args @ List.rev Config.clang_extra_flags else sanitized_args in