This patch updates the command-line option used to enable the analyzer from "--analyzer" to "-fanalyzer" (--analyzer is still accepted, via the map from prefix "--" to "-f" in option_map in opts-common.c)
The patch also adds support for -fno-analyzer: given uses of -fno-analyzer and -fanalyzer, the last one used on the command line "wins". Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu. Pushed to branch "dmalcolm/analyzer" on the GCC git mirror. gcc/ChangeLog: * analyzer/Make-plugin.in (ANALYZER_SELFTEST_FLAGS): Replace "--analyzer" with "-fanalyzer". * common.opt (-analyzer): Replace with.. (fanalyzer): ...this. * doc/invoke.texi: Replace "--analyzer" with "-fanalyzer" throughout. Add -fno-analyzer to index. * gcc.c (driver_handle_option): Handle -fanalyzer by simplying updating flag_analyzer, moving the injection of the plugin to: (process_command): ...here. gcc/testsuite/ChangeLog: * gcc.dg/analyzer/analyzer.exp: Replace "--analyzer" with "-fanalyzer". * gcc.dg/analyzer/disabling.c: New test. * gcc.dg/analyzer/malloc-dce.c: Replace "dg-options" with "dg-additional-options", dropping usage of "-fanalyzer". * gcc.dg/analyzer/malloc-ipa-8-double-free.c: Replace "dg-options" with "dg-additional-options", dropping usage of "-fanalyzer". Add "-fdiagnostics-path-format=inline-events". * gcc.dg/analyzer/malloc-ipa-8-unchecked.c: Replace "dg-options" with "dg-additional-options", dropping usage of "-fanalyzer". * gcc.dg/analyzer/malloc-ipa-9.c: Likewise. * gcc.dg/analyzer/malloc-macro-inline-events.c: Likewise. * gcc.dg/analyzer/malloc-macro-separate-events.c: Likewise. * lib/target-supports.exp (check_effective_target_lto_incremental): Replace "--analyzer" with "-fanalyzer". --- gcc/analyzer/Make-plugin.in | 2 +- gcc/common.opt | 6 +-- gcc/doc/invoke.texi | 38 ++++++++++--------- gcc/gcc.c | 25 ++++++------ gcc/testsuite/gcc.dg/analyzer/analyzer.exp | 2 +- gcc/testsuite/gcc.dg/analyzer/disabling.c | 10 +++++ gcc/testsuite/gcc.dg/analyzer/malloc-dce.c | 2 +- .../analyzer/malloc-ipa-8-double-free.c | 2 +- .../gcc.dg/analyzer/malloc-ipa-8-unchecked.c | 2 +- gcc/testsuite/gcc.dg/analyzer/malloc-ipa-9.c | 2 +- .../analyzer/malloc-macro-inline-events.c | 2 +- .../analyzer/malloc-macro-separate-events.c | 2 +- gcc/testsuite/lib/target-supports.exp | 2 +- 13 files changed, 54 insertions(+), 43 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/analyzer/disabling.c diff --git a/gcc/analyzer/Make-plugin.in b/gcc/analyzer/Make-plugin.in index 08c96f12203e..08f58f467a2a 100644 --- a/gcc/analyzer/Make-plugin.in +++ b/gcc/analyzer/Make-plugin.in @@ -105,7 +105,7 @@ $(ANALYZER_PLUGIN_SO): $(analyzer_OBJS) $(plugin_builddir) # at each stage of the build: selftest-analyzer: s-selftest-analyzer -ANALYZER_SELFTEST_FLAGS = -xc $(SELFTEST_FLAGS) --analyzer +ANALYZER_SELFTEST_FLAGS = -xc $(SELFTEST_FLAGS) -fanalyzer ANALYZER_SELFTEST_DEPS = cc1$(exeext) $(SELFTEST_DEPS) $(ANALYZER_PLUGIN_SO) # Run the analyzer selftests: diff --git a/gcc/common.opt b/gcc/common.opt index 3f6de9629899..840e9f435657 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -266,9 +266,6 @@ Driver Joined Alias(e) -extra-warnings Common Warning Alias(Wextra) --analyzer -Driver Var(analyzer_flag) - -for-assembler Driver Separate Alias(Xassembler) @@ -992,6 +989,9 @@ fallow-store-data-races Common Report Var(flag_store_data_races) Optimization Allow the compiler to introduce new data races on stores. +fanalyzer +Driver Var(flag_analyzer) + fargument-alias Common Ignore Does nothing. Preserved for backward compatibility. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index caeb9ce30f53..286c1623aaa7 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -289,7 +289,7 @@ Objective-C and Objective-C++ Dialects}. @item Warning Options @xref{Warning Options,,Options to Request or Suppress Warnings}. -@gccoptlist{--analyzer -fsyntax-only -fmax-errors=@var{n} -Wpedantic @gol +@gccoptlist{-fanalyzer -fsyntax-only -fmax-errors=@var{n} -Wpedantic @gol -pedantic-errors @gol -w -Wextra -Wall -Waddress -Waddress-of-packed-member @gol -Waggregate-return -Waligned-new @gol @@ -6428,7 +6428,7 @@ equivalent to @option{-Walloca-larger-than=}@samp{SIZE_MAX} or larger. @item -Wno-analyzer-double-fclose @opindex Wanalyzer-double-fclose @opindex Wno-analyzer-double-fclose -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-double-fclose} to disable it. This diagnostic warns for paths through the code in which a @code{FILE *} @@ -6437,7 +6437,7 @@ can have @code{fclose} called on it more than once. @item -Wno-analyzer-double-free @opindex Wanalyzer-double-free @opindex Wno-analyzer-double-free -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-double-free} to disable it. This diagnostic warns for paths through the code in which a pointer @@ -6446,7 +6446,7 @@ can have @code{free} called on it more than once. @item -Wno-analyzer-exposure-through-output-file @opindex Wanalyzer-exposure-through-output-file @opindex Wno-analyzer-exposure-through-output-file -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-exposure-through-output-file} to disable it. @@ -6457,7 +6457,7 @@ security-sensitive value is written to an output file @item -Wno-analyzer-file-leak @opindex Wanalyzer-file-leak @opindex Wno-analyzer-file-leak -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-file-leak} to disable it. @@ -6467,7 +6467,7 @@ This diagnostic warns for paths through the code in which a @item -Wno-analyzer-free-of-non-heap @opindex Wanalyzer-free-of-non-heap @opindex Wno-analyzer-free-of-non-heap -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-free-of-non-heap} to disable it. @@ -6477,7 +6477,7 @@ is called on a non-heap pointer (e.g. an on-stack buffer, or a global). @item -Wno-analyzer-malloc-leak @opindex Wanalyzer-malloc-leak @opindex Wno-analyzer-malloc-leak -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-malloc-leak} to disable it. @@ -6487,7 +6487,7 @@ pointer allocated via @code{malloc} is leaked. @item -Wno-analyzer-possible-null-argument @opindex Wanalyzer-possible-null-argument @opindex Wno-analyzer-possible-null-argument -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-possible-null-argument} to disable it. This diagnostic warns for paths through the code in which a @@ -6498,7 +6498,7 @@ value. @item -Wno-analyzer-possible-null-dereference @opindex Wanalyzer-possible-null-dereference @opindex Wno-analyzer-possible-null-dereference -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-possible-null-dereference} to disable it. This diagnostic warns for paths through the code in which a @@ -6507,7 +6507,7 @@ possibly-NULL value is dereferenced. @item -Wno-analyzer-null-argument @opindex Wanalyzer-null-argument @opindex Wno-analyzer-null-argument -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-null-argument} to disable it. This diagnostic warns for paths through the code in which a @@ -6518,7 +6518,7 @@ value. @item -Wno-analyzer-null-dereference @opindex Wanalyzer-null-dereference @opindex Wno-analyzer-null-dereference -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-null-dereference} to disable it. This diagnostic warns for paths through the code in which a @@ -6527,7 +6527,7 @@ value known to be NULL is dereferenced. @item -Wno-analyzer-stale-setjmp-buffer @opindex Wanalyzer-stale-setjmp-buffer @opindex Wno-analyzer-stale-setjmp-buffer -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-stale-setjmp-buffer} to disable it. This diagnostic warns for paths through the code in which @@ -6543,7 +6543,7 @@ no longer exists, and likely lead to a crash (or worse). @item -Wno-analyzer-tainted-array-index @opindex Wanalyzer-tainted-array-index @opindex Wno-analyzer-tainted-array-index -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-tainted-array-index} to disable it. This diagnostic warns for paths through the code in which a value @@ -6553,7 +6553,7 @@ of an array access without being sanitized. @item -Wno-analyzer-use-after-free @opindex Wanalyzer-use-after-free @opindex Wno-analyzer-use-after-free -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-use-after-free} to disable it. This diagnostic warns for paths through the code in which a @@ -6562,7 +6562,7 @@ pointer is used after @code{free} is called on it. @item -Wno-analyzer-use-of-pointer-in-stale-stack-frame @opindex Wanalyzer-use-of-pointer-in-stale-stack-frame @opindex Wno-analyzer-use-of-pointer-in-stale-stack-frame -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-use-of-pointer-in-stale-stack-frame} to disable it. @@ -6572,7 +6572,7 @@ is dereferenced that points to a variable in a stale stack frame. @item -Wno-analyzer-use-of-uninitialized-value @opindex Wanalyzer-use-of-uninitialized-value @opindex Wno-analyzer-use-of-uninitialized-value -This warning requires @option{--analyzer}, which enables it; use +This warning requires @option{-fanalyzer}, which enables it; use @option{-Wno-analyzer-use-of-uninitialized-value} to disable it. This diagnostic warns for paths through the code in which an uninitialized @@ -8238,8 +8238,10 @@ OpenMP construct. @section Options That Control Static Analysis @table @gcctabopt -@item --analyzer +@item -fanalyzer @opindex analyzer +@opindex fanalyzer +@opindex fno-analyzer This option enables an static analysis of program flow which looks for ``interesting'' interprocedural paths through the code, and issues warnings for problems found on them. @@ -8271,7 +8273,7 @@ support enabled. @item -Wanalyzer-too-complex @opindex Wanalyzer-too-complex @opindex Wno-analyzer-too-complex -If @option{--analyzer} is enabled, the analyzer uses various heuristics +If @option{-fanalyzer} is enabled, the analyzer uses various heuristics to attempt to explore the control flow and data flow in the program, but these can be defeated by sufficiently complicated code. diff --git a/gcc/gcc.c b/gcc/gcc.c index a2d17e672165..e8d3953f4329 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -3965,6 +3965,7 @@ driver_handle_option (struct gcc_options *opts, add_linker_option ("--target-help", 13); break; + case OPT_fanalyzer: case OPT__no_sysroot_suffix: case OPT_pass_exit_codes: case OPT_print_search_dirs: @@ -4289,19 +4290,6 @@ driver_handle_option (struct gcc_options *opts, handle_foffload_option (arg); break; - case OPT__analyzer: - { - validated = true; -#ifdef ENABLE_ANALYZER - save_switch ("-fplugin=analyzer_plugin", 0, NULL, validated, true); -#else - sorry ("%qs was not enabled in this build of GCC" - " (missing configure-time option %qs)", - "--analyzer", "--enable-plugins=analyzer"); -#endif - } - break; - default: /* Various driver options need no special processing at this point, having been handled in a prescan above or being @@ -4623,6 +4611,17 @@ process_command (unsigned int decoded_options_count, CL_DRIVER, &handlers, global_dc); } + if (flag_analyzer) + { +#ifdef ENABLE_ANALYZER + save_switch ("-fplugin=analyzer_plugin", 0, NULL, true, true); +#else + sorry ("%qs was not enabled in this build of GCC" + " (missing configure-time option %qs)", + "-fanalyzer", "--enable-plugins=analyzer"); +#endif + } + /* If the user didn't specify any, default to all configured offload targets. */ if (ENABLE_OFFLOADING && offload_targets == NULL) diff --git a/gcc/testsuite/gcc.dg/analyzer/analyzer.exp b/gcc/testsuite/gcc.dg/analyzer/analyzer.exp index a830cf76a21f..ac9c49511aa0 100644 --- a/gcc/testsuite/gcc.dg/analyzer/analyzer.exp +++ b/gcc/testsuite/gcc.dg/analyzer/analyzer.exp @@ -30,7 +30,7 @@ if [info exists DEFAULT_CFLAGS] then { } # If a testcase doesn't have special options, use these. -set DEFAULT_CFLAGS "--analyzer -fdiagnostics-path-format=separate-events -Wanalyzer-too-complex -fanalyzer-call-summaries" +set DEFAULT_CFLAGS "-fanalyzer -fdiagnostics-path-format=separate-events -Wanalyzer-too-complex -fanalyzer-call-summaries" # Initialize `dg'. dg-init diff --git a/gcc/testsuite/gcc.dg/analyzer/disabling.c b/gcc/testsuite/gcc.dg/analyzer/disabling.c new file mode 100644 index 000000000000..a696d1e021e0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/disabling.c @@ -0,0 +1,10 @@ +/* Verify that we can override -fanalyzer with -fno-analyzer. */ +/* { dg-additional-options "-fno-analyzer" } */ + +#include <stdlib.h> + +void test (void *ptr) +{ + free (ptr); + free (ptr); /* { dg-bogus "free" } */ +} diff --git a/gcc/testsuite/gcc.dg/analyzer/malloc-dce.c b/gcc/testsuite/gcc.dg/analyzer/malloc-dce.c index 1f61b4bc4a2a..1b4b8788b86b 100644 --- a/gcc/testsuite/gcc.dg/analyzer/malloc-dce.c +++ b/gcc/testsuite/gcc.dg/analyzer/malloc-dce.c @@ -1,4 +1,4 @@ -/* { dg-options "--analyzer -O2" } */ +/* { dg-additional-options "-O2" } */ #include <stdlib.h> diff --git a/gcc/testsuite/gcc.dg/analyzer/malloc-ipa-8-double-free.c b/gcc/testsuite/gcc.dg/analyzer/malloc-ipa-8-double-free.c index a63e7e811856..50d907f738c1 100644 --- a/gcc/testsuite/gcc.dg/analyzer/malloc-ipa-8-double-free.c +++ b/gcc/testsuite/gcc.dg/analyzer/malloc-ipa-8-double-free.c @@ -1,6 +1,6 @@ /* Example of a multilevel wrapper around malloc/free, with a double-'free'. */ -/* { dg-options "--analyzer -fdiagnostics-show-line-numbers -fdiagnostics-nn-line-numbers -fanalyzer-checker=malloc -fanalyzer-verbose-state-changes -fdiagnostics-show-caret" } */ +/* { dg-additional-options "-fdiagnostics-show-line-numbers -fdiagnostics-nn-line-numbers -fdiagnostics-path-format=inline-events -fanalyzer-checker=malloc -fanalyzer-verbose-state-changes -fdiagnostics-show-caret" } */ #include <stdlib.h> diff --git a/gcc/testsuite/gcc.dg/analyzer/malloc-ipa-8-unchecked.c b/gcc/testsuite/gcc.dg/analyzer/malloc-ipa-8-unchecked.c index a3a3909f01d3..f204331f0a95 100644 --- a/gcc/testsuite/gcc.dg/analyzer/malloc-ipa-8-unchecked.c +++ b/gcc/testsuite/gcc.dg/analyzer/malloc-ipa-8-unchecked.c @@ -1,6 +1,6 @@ /* Example of a multilevel wrapper around malloc, with an unchecked write. */ -/* { dg-options "--analyzer -fdiagnostics-show-line-numbers -fdiagnostics-nn-line-numbers -fdiagnostics-path-format=inline-events -fanalyzer-checker=malloc -fdiagnostics-show-caret -fanalyzer-verbose-state-changes" } */ +/* { dg-additional-options "-fdiagnostics-show-line-numbers -fdiagnostics-nn-line-numbers -fdiagnostics-path-format=inline-events -fanalyzer-checker=malloc -fdiagnostics-show-caret -fanalyzer-verbose-state-changes" } */ #include <stdlib.h> diff --git a/gcc/testsuite/gcc.dg/analyzer/malloc-ipa-9.c b/gcc/testsuite/gcc.dg/analyzer/malloc-ipa-9.c index 03bcbdb1c122..a0c78fd6c4ec 100644 --- a/gcc/testsuite/gcc.dg/analyzer/malloc-ipa-9.c +++ b/gcc/testsuite/gcc.dg/analyzer/malloc-ipa-9.c @@ -1,4 +1,4 @@ -/* { dg-options "--analyzer -fdiagnostics-path-format=none -fanalyzer-verbosity=1" } */ +/* { dg-additional-options "-fdiagnostics-path-format=none -fanalyzer-verbosity=1" } */ #include <stdlib.h> diff --git a/gcc/testsuite/gcc.dg/analyzer/malloc-macro-inline-events.c b/gcc/testsuite/gcc.dg/analyzer/malloc-macro-inline-events.c index a34b97b72ba1..fad6d6e63744 100644 --- a/gcc/testsuite/gcc.dg/analyzer/malloc-macro-inline-events.c +++ b/gcc/testsuite/gcc.dg/analyzer/malloc-macro-inline-events.c @@ -1,6 +1,6 @@ /* Test path-printing in the face of macros. */ -/* { dg-options "--analyzer -fdiagnostics-show-line-numbers -fdiagnostics-nn-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-show-caret" } */ +/* { dg-additional-options "-fdiagnostics-show-line-numbers -fdiagnostics-nn-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-show-caret" } */ #include "malloc-macro.h" diff --git a/gcc/testsuite/gcc.dg/analyzer/malloc-macro-separate-events.c b/gcc/testsuite/gcc.dg/analyzer/malloc-macro-separate-events.c index 9c7e933d84ae..e7483af9230e 100644 --- a/gcc/testsuite/gcc.dg/analyzer/malloc-macro-separate-events.c +++ b/gcc/testsuite/gcc.dg/analyzer/malloc-macro-separate-events.c @@ -1,6 +1,6 @@ /* Test path-printing in the face of macros. */ -/* { dg-options "--analyzer -fdiagnostics-path-format=separate-events" } */ +/* { dg-additional-options "-fdiagnostics-path-format=separate-events" } */ #include "malloc-macro.h" diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index 59e0540ee237..5089622775ac 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -8470,7 +8470,7 @@ proc check_effective_target_lto_incremental { } { proc check_effective_target_analyzer { } { return [check_no_compiler_messages analyzer object { void foo (void) { } - } "--analyzer"] + } "-fanalyzer"] } # Return 1 if -mx32 -maddress-mode=short can compile, 0 otherwise. -- 2.21.0