Blame m4/virt-compile-warnings.m4

Packit a07778
dnl
Packit a07778
dnl Enable all known GCC compiler warnings, except for those
Packit a07778
dnl we can't yet cope with
Packit a07778
dnl
Packit a07778
AC_DEFUN([LIBVIRT_GLIB_COMPILE_WARNINGS],[
Packit a07778
    dnl ******************************
Packit a07778
    dnl More compiler warnings
Packit a07778
    dnl ******************************
Packit a07778
Packit a07778
    AC_ARG_ENABLE([werror],
Packit a07778
                  AS_HELP_STRING([--enable-werror], [Use -Werror (if supported)]),
Packit a07778
                  [set_werror="$enableval"],
Packit a07778
                  [if test -d $srcdir/.git; then
Packit a07778
                     is_git_version=true
Packit a07778
                     set_werror=yes
Packit a07778
                   else
Packit a07778
                     set_werror=no
Packit a07778
                   fi])
Packit a07778
Packit a07778
    # List of warnings that are not relevant / wanted
Packit a07778
Packit a07778
    # Don't care about C++ compiler compat
Packit a07778
    dontwarn="$dontwarn -Wc++-compat"
Packit a07778
    dontwarn="$dontwarn -Wabi"
Packit a07778
    dontwarn="$dontwarn -Wdeprecated"
Packit a07778
    # Don't care about ancient C standard compat
Packit a07778
    dontwarn="$dontwarn -Wtraditional"
Packit a07778
    # Don't care about ancient C standard compat
Packit a07778
    dontwarn="$dontwarn -Wtraditional-conversion"
Packit a07778
    # Ignore warnings in /usr/include
Packit a07778
    dontwarn="$dontwarn -Wsystem-headers"
Packit a07778
    # Happy for compiler to add struct padding
Packit a07778
    dontwarn="$dontwarn -Wpadded"
Packit a07778
    # GCC very confused with -O2
Packit a07778
    dontwarn="$dontwarn -Wunreachable-code"
Packit a07778
    # Too many to deal with
Packit a07778
    dontwarn="$dontwarn -Wconversion"
Packit a07778
    # Too many to deal with
Packit a07778
    dontwarn="$dontwarn -Wsign-conversion"
Packit a07778
    # GNULIB gettext.h violates
Packit a07778
    dontwarn="$dontwarn -Wvla"
Packit a07778
    # Many GNULIB header violations
Packit a07778
    dontwarn="$dontwarn -Wundef"
Packit a07778
    # Need to allow bad cast for execve()
Packit a07778
    dontwarn="$dontwarn -Wcast-qual"
Packit a07778
    # We need to use long long in many places
Packit a07778
    dontwarn="$dontwarn -Wlong-long"
Packit a07778
    # We allow manual list of all enum cases without default:
Packit a07778
    dontwarn="$dontwarn -Wswitch-default"
Packit a07778
    # We allow optional default: instead of listing all enum values
Packit a07778
    dontwarn="$dontwarn -Wswitch-enum"
Packit a07778
    # Not a problem since we don't use -fstrict-overflow
Packit a07778
    dontwarn="$dontwarn -Wstrict-overflow"
Packit a07778
    # Not a problem since we don't use -funsafe-loop-optimizations
Packit a07778
    dontwarn="$dontwarn -Wunsafe-loop-optimizations"
Packit a07778
    # Things like virAsprintf mean we can't use this
Packit a07778
    dontwarn="$dontwarn -Wformat-nonliteral"
Packit a07778
    # Gnulib's stat-time.h violates this
Packit a07778
    dontwarn="$dontwarn -Waggregate-return"
Packit a07778
    # gcc 4.4.6 complains this is C++ only; gcc 4.7.0 implies this from -Wall
Packit a07778
    dontwarn="$dontwarn -Wenum-compare"
Packit a07778
Packit a07778
    # gcc 4.2 treats attribute(format) as an implicit attribute(nonnull),
Packit a07778
    # which triggers spurious warnings for our usage
Packit a07778
    AC_CACHE_CHECK([whether the C compiler's -Wformat allows NULL strings],
Packit a07778
      [lv_cv_gcc_wformat_null_works], [
Packit a07778
      save_CFLAGS=$CFLAGS
Packit a07778
      CFLAGS='-Wunknown-pragmas -Werror -Wformat'
Packit a07778
      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
Packit a07778
        #include <stddef.h>
Packit a07778
        static __attribute__ ((__format__ (__printf__, 1, 2))) int
Packit a07778
        foo (const char *fmt, ...) { return !fmt; }
Packit a07778
      ]], [[
Packit a07778
        return foo(NULL);
Packit a07778
      ]])],
Packit a07778
      [lv_cv_gcc_wformat_null_works=yes],
Packit a07778
      [lv_cv_gcc_wformat_null_works=no])
Packit a07778
      CFLAGS=$save_CFLAGS])
Packit a07778
Packit a07778
    # Gnulib uses '#pragma GCC diagnostic push' to silence some
Packit a07778
    # warnings, but older gcc doesn't support this.
Packit a07778
    AC_CACHE_CHECK([whether pragma GCC diagnostic push works],
Packit a07778
      [lv_cv_gcc_pragma_push_works], [
Packit a07778
      save_CFLAGS=$CFLAGS
Packit a07778
      CFLAGS='-Wunknown-pragmas -Werror'
Packit a07778
      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
Packit a07778
        #pragma GCC diagnostic push
Packit a07778
        #pragma GCC diagnostic pop
Packit a07778
      ]])],
Packit a07778
      [lv_cv_gcc_pragma_push_works=yes],
Packit a07778
      [lv_cv_gcc_pragma_push_works=no])
Packit a07778
      CFLAGS=$save_CFLAGS])
Packit a07778
    if test $lv_cv_gcc_pragma_push_works = no; then
Packit a07778
      dontwarn="$dontwarn -Wmissing-prototypes"
Packit a07778
      dontwarn="$dontwarn -Wmissing-declarations"
Packit a07778
      dontwarn="$dontwarn -Wcast-align"
Packit a07778
    else
Packit a07778
      AC_DEFINE_UNQUOTED([WORKING_PRAGMA_PUSH], 1,
Packit a07778
       [Define to 1 if gcc supports pragma push/pop])
Packit a07778
    fi
Packit a07778
Packit a07778
    dnl Check whether strchr(s, char variable) causes a bogus compile
Packit a07778
    dnl warning, which is the case with GCC < 4.6 on some glibc
Packit a07778
    AC_CACHE_CHECK([whether the C compiler's -Wlogical-op gives bogus warnings],
Packit a07778
      [lv_cv_gcc_wlogical_op_broken], [
Packit a07778
      save_CFLAGS="$CFLAGS"
Packit a07778
      CFLAGS="-O2 -Wlogical-op -Werror"
Packit a07778
      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
Packit a07778
        #include <string.h>
Packit a07778
        ]], [[
Packit a07778
        const char *haystack;
Packit a07778
        char needle;
Packit a07778
        return strchr(haystack, needle) == haystack;]])],
Packit a07778
        [lv_cv_gcc_wlogical_op_broken=no],
Packit a07778
        [lv_cv_gcc_wlogical_op_broken=yes])
Packit a07778
      CFLAGS="$save_CFLAGS"])
Packit a07778
Packit a07778
    # We might fundamentally need some of these disabled forever, but
Packit a07778
    # ideally we'd turn many of them on
Packit a07778
    dontwarn="$dontwarn -Wfloat-equal"
Packit a07778
    dontwarn="$dontwarn -Wdeclaration-after-statement"
Packit a07778
    dontwarn="$dontwarn -Wpacked"
Packit a07778
    dontwarn="$dontwarn -Wunused-macros"
Packit a07778
    dontwarn="$dontwarn -Woverlength-strings"
Packit a07778
    dontwarn="$dontwarn -Wstack-protector"
Packit a07778
Packit a07778
    # g_clear_object & G_ATOMIC_OP_USE_GCC_BUILTINS causes
Packit a07778
    # violations with this. XXX Fix glib ?
Packit a07778
    dontwarn="$dontwarn -Wbad-function-cast"
Packit a07778
Packit a07778
    # Due to gutils.h bug in g_bit_storage
Packit a07778
    wantwarn="$wantwarn -Wno-sign-conversion"
Packit a07778
    wantwarn="$wantwarn -Wno-conversion"
Packit a07778
    # We can't enable this due to horrible spice_usb_device_get_description
Packit a07778
    # signature
Packit a07778
    wantwarn="$wantwarn -Wno-format-nonliteral"
Packit a07778
Packit a07778
    # Get all possible GCC warnings
Packit a07778
    gl_MANYWARN_ALL_GCC([maybewarn])
Packit a07778
Packit a07778
    # Remove the ones we don't want, blacklisted earlier
Packit a07778
    gl_MANYWARN_COMPLEMENT([wantwarn], [$maybewarn], [$dontwarn])
Packit a07778
Packit a07778
    # GNULIB uses '-W' (aka -Wextra) which includes a bunch of stuff.
Packit a07778
    # Unfortunately, this means you can't simply use '-Wsign-compare'
Packit a07778
    # with gl_MANYWARN_COMPLEMENT
Packit a07778
    # So we have -W enabled, and then have to explicitly turn off...
Packit a07778
    wantwarn="$wantwarn -Wno-sign-compare"
Packit a07778
Packit a07778
    # GNULIB expects this to be part of -Wc++-compat, but we turn
Packit a07778
    # that one off, so we need to manually enable this again
Packit a07778
    wantwarn="$wantwarn -Wjump-misses-init"
Packit a07778
Packit a07778
    # We do "bad" function casts all the time for event callbacks
Packit a07778
    wantwarn="$wantwarn -Wno-cast-function-type"
Packit a07778
Packit a07778
    # GNULIB turns on -Wformat=2 which implies -Wformat-nonliteral,
Packit a07778
    # so we need to manually re-exclude it.  Also, older gcc 4.2
Packit a07778
    # added an implied ATTRIBUTE_NONNULL on any parameter marked
Packit a07778
    # ATTRIBUTE_FMT_PRINT, which causes -Wformat failure on our
Packit a07778
    # intentional use of virReportError(code, NULL).
Packit a07778
    wantwarn="$wantwarn -Wno-format-nonliteral"
Packit a07778
    if test $lv_cv_gcc_wformat_null_works = no; then
Packit a07778
      wantwarn="$wantwarn -Wno-format"
Packit a07778
    fi
Packit a07778
Packit a07778
    # This should be < 256 really. Currently we're down to 4096,
Packit a07778
    # but using 1024 bytes sized buffers (mostly for virStrerror)
Packit a07778
    # stops us from going down further
Packit a07778
    wantwarn="$wantwarn -Wframe-larger-than=4096"
Packit a07778
    dnl wantwarn="$wantwarn -Wframe-larger-than=256"
Packit a07778
Packit a07778
    # Extra special flags
Packit a07778
    dnl -fstack-protector stuff passes gl_WARN_ADD with gcc
Packit a07778
    dnl on Mingw32, but fails when actually used
Packit a07778
    case $host in
Packit a07778
       aarch64-*-*)
Packit a07778
       dnl "error: -fstack-protector not supported for this target [-Werror]"
Packit a07778
       ;;
Packit a07778
       *-*-linux*)
Packit a07778
       dnl Prefer -fstack-protector-strong if it's available.
Packit a07778
       dnl There doesn't seem to be great overhead in adding
Packit a07778
       dnl -fstack-protector-all instead of -fstack-protector.
Packit a07778
       dnl
Packit a07778
       dnl We also don't need ssp-buffer-size with -all or -strong,
Packit a07778
       dnl since functions are protected regardless of buffer size.
Packit a07778
       dnl wantwarn="$wantwarn --param=ssp-buffer-size=4"
Packit a07778
       wantwarn="$wantwarn -fstack-protector-strong"
Packit a07778
       ;;
Packit a07778
       *-*-freebsd*)
Packit a07778
       dnl FreeBSD ships old gcc 4.2.1 which doesn't handle
Packit a07778
       dnl -fstack-protector-all well
Packit a07778
       wantwarn="$wantwarn -fstack-protector"
Packit a07778
Packit a07778
       wantwarn="$wantwarn -Wno-unused-command-line-argument"
Packit a07778
       ;;
Packit a07778
    esac
Packit a07778
    wantwarn="$wantwarn -fexceptions"
Packit a07778
    wantwarn="$wantwarn -fasynchronous-unwind-tables"
Packit a07778
Packit a07778
    # Need -fipa-pure-const in order to make -Wsuggest-attribute=pure
Packit a07778
    # fire even without -O.
Packit a07778
    wantwarn="$wantwarn -fipa-pure-const"
Packit a07778
    # We should eventually enable this, but right now there are at
Packit a07778
    # least 75 functions triggering warnings.
Packit a07778
    wantwarn="$wantwarn -Wno-suggest-attribute=pure"
Packit a07778
    wantwarn="$wantwarn -Wno-suggest-attribute=const"
Packit a07778
Packit a07778
    if test "$set_werror" = "yes"
Packit a07778
    then
Packit a07778
      wantwarn="$wantwarn -Werror"
Packit a07778
    fi
Packit a07778
Packit a07778
    # Check for $CC support of each warning
Packit a07778
    for w in $wantwarn; do
Packit a07778
      gl_WARN_ADD([$w])
Packit a07778
    done
Packit a07778
Packit a07778
    case $host in
Packit a07778
        *-*-linux*)
Packit a07778
        dnl Fall back to -fstack-protector-all if -strong is not available
Packit a07778
        case $WARN_CFLAGS in
Packit a07778
        *-fstack-protector-strong*)
Packit a07778
        ;;
Packit a07778
        *)
Packit a07778
            gl_WARN_ADD(["-fstack-protector-all"])
Packit a07778
        ;;
Packit a07778
        esac
Packit a07778
        ;;
Packit a07778
    esac
Packit a07778
Packit a07778
    # Silence certain warnings in gnulib, and use improved glibc headers
Packit a07778
    AC_DEFINE([lint], [1],
Packit a07778
      [Define to 1 if the compiler is checking for lint.])
Packit a07778
    AH_VERBATIM([FORTIFY_SOURCE],
Packit a07778
    [/* Enable compile-time and run-time bounds-checking, and some warnings,
Packit a07778
        without upsetting newer glibc. */
Packit a07778
     #if !defined _FORTIFY_SOURCE && defined __OPTIMIZE__ && __OPTIMIZE__
Packit a07778
     # define _FORTIFY_SOURCE 2
Packit a07778
     #endif
Packit a07778
    ])
Packit a07778
Packit a07778
    if test "$gl_cv_warn_c__Wlogical_op" = yes &&
Packit a07778
       test "$lv_cv_gcc_wlogical_op_broken" = yes; then
Packit a07778
      AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP], 1,
Packit a07778
       [Define to 1 if gcc -Wlogical-op reports false positives on strchr])
Packit a07778
    fi
Packit a07778
])