On 5/23/20 9:08 AM, Paul Eggert wrote: > So I am thinking of killing two > stones by doing the following. > > 1. Test for -fanalyzer, -Wall, -Wextra. > > 2. Test for flags not automatically enabled by -fanalyzer, -Wall, -Wextra but > flags that we want anyway. > > 3. Test for flags automatically enabled by -fanalyzer, -Wall, -Wextra that are > also flags that we don't want.
I did that in Gnulib by installing the attached patch. This could greatly increase compile times due to the -fanalyzer option, so let's keep an eye out for that. On 5/23/20 9:22 AM, Tim Rühsen wrote: > This has been done for Wget2 > https://gitlab.com/gnuwget/wget2/-/blob/master/m4/wget_manywarnings.m4 > > Example usage at L123+: > https://gitlab.com/gnuwget/wget2/-/blob/master/configure.ac > > To make it usable for other projects, it needs some merging with the > manywarnings.m4 from gnulib, IMO. I would support any volunteer as good > as i can. Thanks. I think this different approach should be a win. I wanted to get the old approach working with GCC 10.1 first though (and did that via the attached patch) before trying out this new method, so that we can verify that switching from old to new methods improves 'configure' performance without changing the set of flags given to GCC. Perhaps we can wait for a bit for a shakeout period for -fanalyzer etc., and then look into switching methods.
>From 3831e2e9f355c557b0c0ed9712548b62feaf694f Mon Sep 17 00:00:00 2001 From: Paul Eggert <egg...@cs.ucla.edu> Date: Wed, 1 Jul 2020 17:00:51 -0700 Subject: [PATCH] manywarnings: improve port to GCC 10.1 * build-aux/gcc-warning.spec: Also list warnings that are default or are enabled by already-given flags. This lets us speed up checking for attributes, and makes the generated compilation commands shorter. Add -Wanalyzer-too-complex (too much noise). * m4/manywarnings.m4 (gl_MANYWARN_COMPLEMENT) (gl_MANYWARN_ALL_GCC): Use gl_AS_VAR_APPEND to append to shell variables that may have long values. (gl_MANYWARN_ALL_GCC): Omit flags that are default or are consequences of other flags, to speed up checking and shorten commands. --- ChangeLog | 12 +++ build-aux/gcc-warning.spec | 144 ++++++++++++++++++++++++-- m4/manywarnings.m4 | 206 ++++++------------------------------- 3 files changed, 181 insertions(+), 181 deletions(-) diff --git a/ChangeLog b/ChangeLog index edb63b348..6115ab946 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,17 @@ 2020-07-01 Paul Eggert <egg...@cs.ucla.edu> + manywarnings: improve port to GCC 10.1 + * build-aux/gcc-warning.spec: Also list warnings that are default + or are enabled by already-given flags. This lets us speed up + checking for attributes, and makes the generated compilation + commands shorter. Add -Wanalyzer-too-complex (too much noise). + * m4/manywarnings.m4 (gl_MANYWARN_COMPLEMENT) + (gl_MANYWARN_ALL_GCC): Use gl_AS_VAR_APPEND to append + to shell variables that may have long values. + (gl_MANYWARN_ALL_GCC): Omit flags that are default or are + consequences of other flags, to speed up checking and + shorten commands. + tests: pacify gcc -fanalyzer on zerosize_ptr * tests/test-memcasecmp.c (main): * tests/test-memchr.c (main): diff --git a/build-aux/gcc-warning.spec b/build-aux/gcc-warning.spec index 89a0bc734..6c0602be4 100644 --- a/build-aux/gcc-warning.spec +++ b/build-aux/gcc-warning.spec @@ -1,24 +1,51 @@ # options to filter out, and why --all-warnings alias for -Wall --extra-warnings alias for -Wextra +-W alias for -Wextra -Wabi this is now a no-op -Wabi-tag c++ -Wabi= c++ +-Wabsolute-value enabled by -Wextra +-Waddress enabled by -Wall +-Waddress-of-packed-member default -Waggregate-return obsolescent +-Waggressive-loop-optimizations default -Waliasing fortran -Walign-commons fortran -Waligned-new=[none|global|all] c++ --Walloc-size-larger-than=<bytes> handled specially by gl_MANYWARN_ALL_GCC +-Walloc-size-larger-than=<bytes> defaults to PTRDIFF_MAX -Walloc-zero Gnulib fixes this problem -Walloca we like alloca in small doses -Walloca-larger-than=<number> FIXME: choose something sane? -Wampersand fortran +-Wanalyzer-double-fclose enabled by -fanalyzer +-Wanalyzer-double-free enabled by -fanalyzer +-Wanalyzer-exposure-through-output-file enabled by -fanalyzer +-Wanalyzer-file-leak enabled by -fanalyzer +-Wanalyzer-free-of-non-heap enabled by -fanalyzer +-Wanalyzer-malloc-leak enabled by -fanalyzer +-Wanalyzer-null-argument enabled by -fanalyzer +-Wanalyzer-null-dereference enabled by -fanalyzer +-Wanalyzer-possible-null-argument enabled by -fanalyzer +-Wanalyzer-possible-null-dereference enabled by -fanalyzer +-Wanalyzer-stale-setjmp-buffer implied by -fanalyzer +-Wanalyzer-tainted-array-index FIXME maybe? too much noise +-Wanalyzer-too-complex enabled by -fanalyzer +-Wanalyzer-unsafe-call-within-signal-handler enabled by -fanalyzer +-Wanalyzer-use-after-free enabled by -fanalyzer +-Wanalyzer-use-of-pointer-in-stale-stack-frame enabled by -fanalyzer -Warray-bounds covered by -Warray-bounds= -Warray-bounds=<0,2> handled specially by gl_MANYWARN_ALL_GCC -Warray-temporaries fortran -Wassign-intercept objc/objc++ -Wattribute-alias covered by -Wattribute-alias=2 -Wattribute-alias=<0,2> handled specially by gl_MANYWARN_ALL_GCC +-Wattribute-warning default +-Wattributes default +-Wbool-compare enabled by -Wall +-Wbool-operation enabled by -Wall +-Wbuiltin-declaration-mismatch default +-Wbuiltin-macro-redefined default -Wc++-compat only useful for code meant to be compiled by a C++ compiler -Wc++0x-compat c++ -Wc++11-compat c++ @@ -31,63 +58,120 @@ -Wc11-c2x-compat c compatibility -Wc90-c99-compat c compatibility -Wc99-c11-compat c compatibility +-Wcannot-profile default +-Wcast-align enabled by -Wcast-align=strict +-Wcast-function-type enabled by -Wextra -Wcast-qual FIXME maybe? too much noise; encourages bad changes -Wcast-result D -Wcatch-value c++ -Wcatch-value=<0,3> c++ +-Wchar-subscripts enabled by -Wall -Wcharacter-truncation fortran -Wchkp deprecated -Wclass-conversion c++ and objc++ -Wclass-memaccess c++ +-Wclobbered enabled by -Wextra -Wcomma-subscript c++ and objc++ +-Wcomment enabled by -Wall +-Wcomments alias for -Wcomment -Wcompare-reals fortran -Wconditionally-supported c++ and objc++ -Wconversion FIXME maybe? too much noise; encourages bad changes -Wconversion-extra fortran -Wconversion-null c++ and objc++ +-Wcoverage-mismatch default +-Wcpp default -Wctor-dtor-privacy c++ +-Wdangling-else enabled by -Wparentheses -Wdeclaration-after-statement FIXME: do not want. others may -Wdelete-incomplete c++ and objc++ -Wdelete-non-virtual-dtor c++ +-Wdeprecated default -Wdeprecated-copy c++ and objc++ -Wdeprecated-copy-dtor c++ and objc++ +-Wdeprecated-declarations default +-Wdesignated-init default +-Wdiscarded-array-qualifiers default +-Wdiscarded-qualifiers default -Wdo-subscript fortran +-Wdiv-by-zero default +-Wduplicate-decl-specifier enabled by -Wall -Weffc++ c++ +-Wempty-body enabled by -Wextra +-Wenum-compare enabled by -Wall +-Wenum-conversion enabled by -Wextra +-Wendif-labels default -Werror-implicit-function-declaration deprecated +-Wexpansion-to-defined enabled by -Wextra -Wextra-semi c++ -Wfloat-conversion FIXME maybe? borderline. some will want this -Wfloat-equal FIXME maybe? borderline. some will want this -Wformat covered by -Wformat=2 +-Wformat-contains-nul default +-Wformat-diag enabled by -Wformat=2 +-Wformat-extra-args enabled by -Wformat=2 +-Wformat-nonliteral enabled by -Wformat=2 -Wformat-overflow<0,2> gcc --help=warnings artifact -Wformat-overflow=<0,2> handled specially by gl_MANYWARN_ALL_GCC +-Wformat-security enabled by -Wformat=2 -Wformat-truncation covered by -Wformat-truncation=2 -Wformat-truncation=<0,2> handled specially by gl_MANYWARN_ALL_GCC +-Wformat-y2k enabled by -Wformat=2 +-Wformat-zero-length enabled by -Wformat=2 -Wformat=<0,2> gcc --help=warnings artifact +-Wframe-address enabled by -Wall -Wframe-larger-than=<byte-size> FIXME: choose something sane? +-Wfree-nonheap-object default -Wfunction-elimination fortran +-Whsa default +-Wif-not-aligned default +-Wignored-attributes default +-Wignored-qualifiers enabled by -Wextra +-Wimplicit enabled by -Wall -Wimplicit-fallthrough covered by -Wimplicit-fallthrough=2 -Wimplicit-fallthrough=<0,5> handled specially by gl_MANYWARN_ALL_GCC +-Wimplicit-function-declaration enabled by -Wimplicit +-Wimplicit-int enabled by -Wimplicit -Wimplicit-interface fortran -Wimplicit-procedure fortran -Winaccessible-base c++ and objc++ +-Wincompatible-pointer-types default -Winherited-variadic-ctor c++ -Winit-list-lifetime c++ and objc++ +-Wint-conversion default +-Wint-in-bool-context enabled by -Wall +-Wint-to-pointer-cast default -Winteger-division fortran -Wintrinsic-shadow fortran -Wintrinsics-std fortran +-Winvalid-memory-model default -Winvalid-offsetof c++ and objc++ -Wjump-misses-init only useful for code meant to be compiled by a C++ compiler -Wlarger-than- gcc --help=warnings artifact -Wlarger-than=<byte-size> FIXME: choose something sane? -Wline-truncation fortran -Wliteral-suffix c++ and objc++ +-Wlogical-not-parentheses enabled by -Wall -Wlong-long obsolescent -Wlto-type-mismatch c++ and objc++ +-Wmain enabled by -Wall +-Wmaybe-uninitialized enabled by -Wall or -Wextra +-Wmemset-elt-size enabled by -Wall +-Wmemset-transposed-args enabled by -Wall +-Wmisleading-indentation enabled by -Wall -Wmismatched-tags c++ and objc++ +-Wmissing-attributes enabled by -Wall +-Wmissing-braces enabled by -Wall +-Wmissing-field-initializers enabled by -Wextra -Wmissing-format-attribute obsolescent -Wmissing-noreturn obsolescent +-Wmissing-parameter-type enabled by -Wextra +-Wmissing-profile default +-Wmultichar default -Wmultiple-inheritance c++ and objc++ +-Wmultistatement-macros enabled by -Wall -Wnamespaces c++ +-Wnarrowing enabled by -Wall -Wno-alloc-size-larger-than see -Walloc-size-larger-than -Wno-alloca-larger-than see -Walloca-larger-than -Wno-frame-larger-than see -Wframe-larger-than @@ -98,21 +182,35 @@ -Wnoexcept-type c++ -Wnon-template-friend c++ -Wnon-virtual-dtor c++ --Wnormalized covered by -Wnormalized= --Wnormalized=[none|id|nfc|nfkc] handled specially by gl_MANYWARN_ALL_GCC +-Wnonnull enabled by -Wall or -Wformat +-Wnonnull-compare enabled by -Wall +-Wnormalized default +-Wnormalized=[none|id|nfc|nfkc] defaults to nfc +-Wodr default -Wold-style-cast c++ and objc++ +-Wold-style-declaration enabled by -Wextra +-Woverflow default -Woverloaded-virtual c++ +-Woverride-init enabled by -Wextra -Woverride-init-side-effects c++ and objc++ -Woverwrite-recursive fortran +-Wpacked-bitfield-compat default +-Wpacked-not-aligned enabled by -Wall -Wpadded FIXME maybe? warns about "stabil" member in /usr/include/bits/timex.h +-Wparentheses enabled by -Wall -Wpedantic FIXME: too strict? -Wpessimizing-move c++ and objc++ -Wplacement-new c++ -Wplacement-new=<0,2> c++ -Wpmf-conversions c++ and objc++ +-Wpointer-compare default +-Wpointer-sign enabled by -Wall +-Wpointer-to-int-cast default +-Wpragmas default -Wprio-ctor-dtor c++ -Wproperty-assign-default objc++ -Wprotocol objc++ +-Wpsabi default -Wreal-q-constant fortran -Wrealloc-lhs fortran -Wrealloc-lhs-all fortran @@ -121,53 +219,87 @@ -Wredundant-tags c++ and objc++ -Wregister c++ and objc++ -Wreorder c++ and objc++ +-Wrestrict enabled by -Wall +-Wreturn-local-addr default +-Wreturn-type enabled by -Wall +-Wscalar-storage-order default -Wselector objc and objc++ +-Wsequence-point enabled by -Wall -Wshadow-compatible-local covered by -Wshadow -Wshadow-ivar objc -Wshadow-local covered by -Wshadow -Wshadow=compatible-local covered by -Wshadow -Wshadow=global covered by -Wshadow -Wshadow=local covered by -Wshadow +-Wshift-count-negative default +-Wshift-count-overflow default +-Wshift-negative-value enabled by -Wextra -Wshift-overflow covered by -Wshift-overflow=2 -Wshift-overflow=<0,2> gcc --help=warnings artifact -Wsign-compare FIXME maybe? borderline. some will want this -Wsign-conversion FIXME maybe? borderline. some will want this -Wsign-promo c++ and objc++ -Wsized-deallocation c++ and objc++ +-Wsizeof-array-argument default +-Wsizeof-pointer-div enabled by -Wall +-Wsizeof-pointer-memaccess enabled by -Wall -Wstack-usage=<byte-size> FIXME: choose something sane? +-Wstrict-aliasing enabled by -Wall -Wstrict-aliasing=<0,3> FIXME: choose something sane? -Wstrict-null-sentinel c++ and objc++ -Wstrict-overflow=<0,5> FIXME: choose something sane? -Wstrict-selector-match objc and objc++ --Wstringop-overflow covered by -Wstringop-overflow= --Wstringop-overflow=<0,4> handled specially by gl_MANYWARN_ALL_GCC +-Wstring-compare enabled by -Wextra +-Wstringop-overflow covered by -Wstringop-overflow=2 +-Wstringop-overflow=<0,4> defaults to 2 +-Wstringop-truncation default -Wsubobject-linkage c++ and objc++ -Wsuggest-override c++ and objc++ -Wsurprising fortran +-Wswitch enabled by -Wall +-Wswitch-bool default -Wswitch-default https://lists.gnu.org/r/bug-gnulib/2018-05/msg00179.html -Wswitch-enum FIXME maybe? borderline. some will want this +-Wswitch-outside-range default +-Wswitch-unreachable default -Wsynth deprecated -Wtabs fortran -Wtarget-lifetime fortran +-Wtautological-compare enabled by -Wall -Wtemplates c++ and objc++ -Wterminate c++ and objc++ -Wtraditional obsolescent -Wtraditional-conversion obsolescent +-Wtrigraphs enabled by -Wall +-Wtype-limits enabled by -Wextra -Wundeclared-selector objc and objc++ -Wundef FIXME maybe? too many false positives -Wundefined-do-loop fortran -Wunderflow fortran -Wunreachable-code obsolescent no-op -Wunsuffixed-float-constants triggers warning in gnulib's timespec.h --Wunused-const-variable covered by -Wunusec-const-variable=2 +-Wunused enabled by -Wall +-Wunused-but-set-parameter enabled by -Wunused +-Wunused-but-set-variable enabled by -Wunused +-Wunused-const-variable covered by -Wunused-const-variable=2 -Wunused-const-variable=<0,2> gcc --help=warnings artifact -Wunused-dummy-argument fortran +-Wunused-function enabled by -Wunused +-Wunused-label enabled by -Wunused +-Wunused-local-typedefs enabled by -Wunused +-Wunused-parameter enabled by -Wunused +-Wunused-result enabled by -Wunused +-Wunused-value enabled by -Wunused +-Wunused-variable enabled by -Wunused -Wuse-without-only fortran -Wuseless-cast c++ and objc++ +-Wvarargs default -Wvirtual-inheritance c++ -Wvirtual-move-assign c++ -Wvla-larger-than=<number> handled specially by gl_MANYWARN_ALL_GCC -Wvolatile c++ and objc++ +-Wvolatile-register-var enabled by -Wall -Wzero-as-null-pointer-constant c++ and objc++ +-Wzero-length-bounds enabled by -Wall -Wzerotrip fortran -frequire-return-statement go diff --git a/m4/manywarnings.m4 b/m4/manywarnings.m4 index 719bafb29..d18da048d 100644 --- a/m4/manywarnings.m4 +++ b/m4/manywarnings.m4 @@ -1,4 +1,4 @@ -# manywarnings.m4 serial 19 +# manywarnings.m4 serial 20 dnl Copyright (C) 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -21,7 +21,7 @@ AC_DEFUN([gl_MANYWARN_COMPLEMENT], *" $gl_warn_item "*) ;; *) - gl_warn_set="$gl_warn_set $gl_warn_item" + gl_AS_VAR_APPEND([gl_warn_set], [" $gl_warn_item"]) ;; esac done @@ -49,12 +49,12 @@ m4_defun([gl_MANYWARN_ALL_GCC(C)], AC_REQUIRE([AC_PROG_CC]) if test -n "$GCC"; then - dnl Check if -W -Werror -Wno-missing-field-initializers is supported + dnl Check if -Wextra -Werror -Wno-missing-field-initializers is supported dnl with the current $CC $CFLAGS $CPPFLAGS. AC_CACHE_CHECK([whether -Wno-missing-field-initializers is supported], [gl_cv_cc_nomfi_supported], [gl_save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -W -Werror -Wno-missing-field-initializers" + CFLAGS="$CFLAGS -Wextra -Werror -Wno-missing-field-initializers" AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[]], [[]])], [gl_cv_cc_nomfi_supported=yes], @@ -68,7 +68,7 @@ m4_defun([gl_MANYWARN_ALL_GCC(C)], AC_CACHE_CHECK([whether -Wno-missing-field-initializers is needed], [gl_cv_cc_nomfi_needed], [gl_save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -W -Werror" + CFLAGS="$CFLAGS -Wextra -Werror" AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[int f (void) @@ -105,153 +105,41 @@ m4_defun([gl_MANYWARN_ALL_GCC(C)], # To compare this list to your installed GCC's, run this Bash command: # # comm -3 \ - # <((sed -n 's/^ *\(-[^ 0-9][^ ]*\) .*/\1/p' manywarnings.m4; \ + # <((sed -n 's/^ *\(-[^ 0-9][^ ]*\).*/\1/p' manywarnings.m4; \ # awk '/^[^#]/ {print $1}' ../build-aux/gcc-warning.spec) | sort) \ # <(LC_ALL=C gcc --help=warnings | sed -n 's/^ \(-[^ ]*\) .*/\1/p' | sort) - gl_manywarn_set= - for gl_manywarn_item in -fno-common \ - -W \ - -Wabsolute-value \ - -Waddress \ - -Waddress-of-packed-member \ - -Waggressive-loop-optimizations \ + $1= + for gl_manywarn_item in -fanalyzer -fno-common \ -Wall \ - -Wanalyzer-double-fclose \ - -Wanalyzer-double-free \ - -Wanalyzer-exposure-through-output-file \ - -Wanalyzer-file-leak \ - -Wanalyzer-free-of-non-heap \ - -Wanalyzer-malloc-leak \ - -Wanalyzer-null-argument \ - -Wanalyzer-null-dereference \ - -Wanalyzer-possible-null-argument \ - -Wanalyzer-possible-null-dereference \ - -Wanalyzer-stale-setjmp-buffer \ - -Wanalyzer-tainted-array-index \ - -Wanalyzer-too-complex \ - -Wanalyzer-unsafe-call-within-signal-handler \ - -Wanalyzer-use-after-free \ - -Wanalyzer-use-of-pointer-in-stale-stack-frame \ -Warith-conversion \ - -Wattribute-warning \ - -Wattributes \ -Wbad-function-cast \ - -Wbool-compare \ - -Wbool-operation \ - -Wbuiltin-declaration-mismatch \ - -Wbuiltin-macro-redefined \ - -Wcannot-profile \ - -Wcast-align \ -Wcast-align=strict \ - -Wcast-function-type \ - -Wchar-subscripts \ - -Wclobbered \ - -Wcomment \ - -Wcomments \ - -Wcoverage-mismatch \ - -Wcpp \ - -Wdangling-else \ -Wdate-time \ - -Wdeprecated \ - -Wdeprecated-declarations \ - -Wdesignated-init \ -Wdisabled-optimization \ - -Wdiscarded-array-qualifiers \ - -Wdiscarded-qualifiers \ - -Wdiv-by-zero \ -Wdouble-promotion \ -Wduplicated-branches \ -Wduplicated-cond \ - -Wduplicate-decl-specifier \ - -Wempty-body \ - -Wendif-labels \ - -Wenum-compare \ - -Wenum-conversion \ - -Wexpansion-to-defined \ -Wextra \ - -Wformat-contains-nul \ - -Wformat-diag \ - -Wformat-extra-args \ - -Wformat-nonliteral \ - -Wformat-security \ -Wformat-signedness \ - -Wformat-y2k \ - -Wformat-zero-length \ - -Wframe-address \ - -Wfree-nonheap-object \ - -Whsa \ - -Wif-not-aligned \ - -Wignored-attributes \ - -Wignored-qualifiers \ - -Wimplicit \ - -Wimplicit-function-declaration \ - -Wimplicit-int \ - -Wincompatible-pointer-types \ -Winit-self \ -Winline \ - -Wint-conversion \ - -Wint-in-bool-context \ - -Wint-to-pointer-cast \ - -Winvalid-memory-model \ -Winvalid-pch \ - -Wlogical-not-parentheses \ -Wlogical-op \ - -Wmain \ - -Wmaybe-uninitialized \ - -Wmemset-elt-size \ - -Wmemset-transposed-args \ - -Wmisleading-indentation \ - -Wmissing-attributes \ - -Wmissing-braces \ -Wmissing-declarations \ - -Wmissing-field-initializers \ -Wmissing-include-dirs \ - -Wmissing-parameter-type \ - -Wmissing-profile \ -Wmissing-prototypes \ - -Wmultichar \ - -Wmultistatement-macros \ - -Wnarrowing \ -Wnested-externs \ - -Wnonnull \ - -Wnonnull-compare \ -Wnull-dereference \ - -Wodr \ - -Wold-style-declaration \ -Wold-style-definition \ -Wopenmp-simd \ - -Woverflow \ -Woverlength-strings \ - -Woverride-init \ -Wpacked \ - -Wpacked-bitfield-compat \ - -Wpacked-not-aligned \ - -Wparentheses \ -Wpointer-arith \ - -Wpointer-compare \ - -Wpointer-sign \ - -Wpointer-to-int-cast \ - -Wpragmas \ - -Wpsabi \ - -Wrestrict \ - -Wreturn-local-addr \ - -Wreturn-type \ - -Wscalar-storage-order \ - -Wsequence-point \ -Wshadow \ - -Wshift-count-negative \ - -Wshift-count-overflow \ - -Wshift-negative-value \ - -Wsizeof-array-argument \ - -Wsizeof-pointer-div \ - -Wsizeof-pointer-memaccess \ -Wstack-protector \ - -Wstrict-aliasing \ -Wstrict-overflow \ -Wstrict-prototypes \ - -Wstring-compare \ - -Wstringop-truncation \ -Wsuggest-attribute=cold \ -Wsuggest-attribute=const \ -Wsuggest-attribute=format \ @@ -260,95 +148,63 @@ m4_defun([gl_MANYWARN_ALL_GCC(C)], -Wsuggest-attribute=pure \ -Wsuggest-final-methods \ -Wsuggest-final-types \ - -Wswitch \ - -Wswitch-bool \ - -Wswitch-outside-range \ - -Wswitch-unreachable \ -Wsync-nand \ -Wsystem-headers \ - -Wtautological-compare \ -Wtrampolines \ - -Wtrigraphs \ - -Wtype-limits \ -Wuninitialized \ -Wunknown-pragmas \ -Wunsafe-loop-optimizations \ - -Wunused \ - -Wunused-but-set-parameter \ - -Wunused-but-set-variable \ - -Wunused-function \ - -Wunused-label \ - -Wunused-local-typedefs \ -Wunused-macros \ - -Wunused-parameter \ - -Wunused-result \ - -Wunused-value \ - -Wunused-variable \ - -Wvarargs \ -Wvariadic-macros \ -Wvector-operation-performance \ -Wvla \ - -Wvolatile-register-var \ -Wwrite-strings \ - -Wzero-length-bounds \ \ ; do - gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item" + gl_AS_VAR_APPEND([$1], [" $gl_manywarn_item"]) done # gcc --help=warnings outputs an unusual form for these options; list # them here so that the above 'comm' command doesn't report a false match. - # Would prefer "min (PTRDIFF_MAX, SIZE_MAX)", but it must be a literal. - # Also, AC_COMPUTE_INT requires it to fit in a long; it is 2**63 on - # the only platforms where it does not fit in a long, so make that - # a special case. - AC_MSG_CHECKING([max safe object size]) - AC_COMPUTE_INT([gl_alloc_max], - [LONG_MAX < (PTRDIFF_MAX < (size_t) -1 ? PTRDIFF_MAX : (size_t) -1) - ? -1 - : PTRDIFF_MAX < (size_t) -1 ? (long) PTRDIFF_MAX : (long) (size_t) -1], - [[#include <limits.h> - #include <stddef.h> - #include <stdint.h> - ]], - [gl_alloc_max=2147483647]) - case $gl_alloc_max in - -1) gl_alloc_max=9223372036854775807;; - esac - AC_MSG_RESULT([$gl_alloc_max]) - gl_manywarn_set="$gl_manywarn_set -Walloc-size-larger-than=$gl_alloc_max" - gl_manywarn_set="$gl_manywarn_set -Warray-bounds=2" - gl_manywarn_set="$gl_manywarn_set -Wattribute-alias=2" - gl_manywarn_set="$gl_manywarn_set -Wformat-overflow=2" - gl_manywarn_set="$gl_manywarn_set -Wformat-truncation=2" - gl_manywarn_set="$gl_manywarn_set -Wimplicit-fallthrough=5" - gl_manywarn_set="$gl_manywarn_set -Wnormalized=nfc" - gl_manywarn_set="$gl_manywarn_set -Wshift-overflow=2" - gl_manywarn_set="$gl_manywarn_set -Wstringop-overflow=2" - gl_manywarn_set="$gl_manywarn_set -Wunused-const-variable=2" - gl_manywarn_set="$gl_manywarn_set -Wvla-larger-than=4031" + gl_AS_VAR_APPEND([$1], [' -Warray-bounds=2']) + gl_AS_VAR_APPEND([$1], [' -Wattribute-alias=2']) + gl_AS_VAR_APPEND([$1], [' -Wformat-overflow=2']) + gl_AS_VAR_APPEND([$1], [' -Wformat=2']) + gl_AS_VAR_APPEND([$1], [' -Wformat-truncation=2']) + gl_AS_VAR_APPEND([$1], [' -Wimplicit-fallthrough=5']) + gl_AS_VAR_APPEND([$1], [' -Wshift-overflow=2']) + gl_AS_VAR_APPEND([$1], [' -Wunused-const-variable=2']) + gl_AS_VAR_APPEND([$1], [' -Wvla-larger-than=4031']) # These are needed for older GCC versions. if test -n "$GCC"; then case `($CC --version) 2>/dev/null` in 'gcc (GCC) '[[0-3]].* | \ 'gcc (GCC) '4.[[0-7]].*) - gl_manywarn_set="$gl_manywarn_set -fdiagnostics-show-option" - gl_manywarn_set="$gl_manywarn_set -funit-at-a-time" + gl_AS_VAR_APPEND([$1], [' -fdiagnostics-show-option']) + gl_AS_VAR_APPEND([$1], [' -funit-at-a-time']) ;; esac fi # Disable specific options as needed. if test "$gl_cv_cc_nomfi_needed" = yes; then - gl_manywarn_set="$gl_manywarn_set -Wno-missing-field-initializers" + gl_AS_VAR_APPEND([$1], [' -Wno-missing-field-initializers']) fi if test "$gl_cv_cc_uninitialized_supported" = no; then - gl_manywarn_set="$gl_manywarn_set -Wno-uninitialized" + gl_AS_VAR_APPEND([$1], [' -Wno-uninitialized']) fi - $1=$gl_manywarn_set + # Some warnings have too many false alarms in GCC 10.1. + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93695 + gl_AS_VAR_APPEND([$1], [' -Wno-analyzer-double-free']) + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94458 + gl_AS_VAR_APPEND([$1], [' -Wno-analyzer-malloc-leak']) + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94851 + gl_AS_VAR_APPEND([$1], [' -Wno-analyzer-null-dereference']) + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95758 + gl_AS_VAR_APPEND([$1], [' -Wno-analyzer-use-after-free']) AC_LANG_POP([C]) ]) -- 2.17.1