Blame m4/virt-compile-warnings.m4

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