From 3c1e1933b681cb68e0494c09d902e0187673ecc3 Mon Sep 17 00:00:00 2001 From: szubersk Date: Wed, 30 Nov 2022 20:27:28 +1000 Subject: [PATCH] Fix GCC 12 compilation errors Squelch false positives reported by GCC 12 with UBSan. Reviewed-by: Richard Yao Reviewed-by: Brian Behlendorf Signed-off-by: szubersk Closes #14150 --- cmd/zfs/zfs_main.c | 2 +- cmd/zpool/zpool_main.c | 2 +- config/always-compiler-options.m4 | 56 +++++++++++++++++++++++++++++++ config/zfs-build.m4 | 2 ++ lib/libnvpair/libnvpair.c | 15 +++++++++ lib/libzfs/libzfs_sendrecv.c | 30 +++++++++++++++++ module/icp/algs/blake3/blake3.c | 2 +- module/lua/ldo.c | 3 +- module/os/linux/zfs/zio_crypt.c | 17 ++++++++++ 9 files changed, 125 insertions(+), 4 deletions(-) diff --git a/cmd/zfs/zfs_main.c b/cmd/zfs/zfs_main.c index 2d644c5de1..03640a4cdc 100644 --- a/cmd/zfs/zfs_main.c +++ b/cmd/zfs/zfs_main.c @@ -548,7 +548,7 @@ usage(boolean_t requested) show_properties = B_TRUE; if (show_properties) { - (void) fprintf(fp, + (void) fprintf(fp, "%s", gettext("\nThe following properties are supported:\n")); (void) fprintf(fp, "\n\t%-14s %s %s %s\n\n", diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c index 8a4f3dd162..0b55bf21f4 100644 --- a/cmd/zpool/zpool_main.c +++ b/cmd/zpool/zpool_main.c @@ -548,7 +548,7 @@ usage(boolean_t requested) (strcmp(current_command->name, "get") == 0) || (strcmp(current_command->name, "list") == 0))) { - (void) fprintf(fp, + (void) fprintf(fp, "%s", gettext("\nthe following properties are supported:\n")); (void) fprintf(fp, "\n\t%-19s %s %s\n\n", diff --git a/config/always-compiler-options.m4 b/config/always-compiler-options.m4 index a673196915..1e7ec3db9f 100644 --- a/config/always-compiler-options.m4 +++ b/config/always-compiler-options.m4 @@ -227,6 +227,62 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_INFINITE_RECURSION], [ AC_SUBST([INFINITE_RECURSION]) ]) +dnl # +dnl # Check if kernel cc supports -Winfinite-recursion option. +dnl # +AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_INFINITE_RECURSION], [ + AC_MSG_CHECKING([whether $KERNEL_CC supports -Winfinite-recursion]) + + saved_cc="$CC" + saved_flags="$CFLAGS" + CC="gcc" + CFLAGS="$CFLAGS -Werror -Winfinite-recursion" + + AS_IF([ test -n "$KERNEL_CC" ], [ + CC="$KERNEL_CC" + ]) + AS_IF([ test -n "$KERNEL_LLVM" ], [ + CC="clang" + ]) + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ + KERNEL_INFINITE_RECURSION=-Winfinite-recursion + AC_DEFINE([HAVE_KERNEL_INFINITE_RECURSION], 1, + [Define if compiler supports -Winfinite-recursion]) + AC_MSG_RESULT([yes]) + ], [ + KERNEL_INFINITE_RECURSION= + AC_MSG_RESULT([no]) + ]) + + CC="$saved_cc" + CFLAGS="$saved_flags" + AC_SUBST([KERNEL_INFINITE_RECURSION]) +]) + +dnl # +dnl # Check if cc supports -Wformat-overflow option. +dnl # +AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_FORMAT_OVERFLOW], [ + AC_MSG_CHECKING([whether $CC supports -Wformat-overflow]) + + saved_flags="$CFLAGS" + CFLAGS="$CFLAGS -Werror -Wformat-overflow" + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [ + FORMAT_OVERFLOW=-Wformat-overflow + AC_DEFINE([HAVE_FORMAT_OVERFLOW], 1, + [Define if compiler supports -Wformat-overflow]) + AC_MSG_RESULT([yes]) + ], [ + FORMAT_OVERFLOW= + AC_MSG_RESULT([no]) + ]) + + CFLAGS="$saved_flags" + AC_SUBST([FORMAT_OVERFLOW]) +]) + dnl # dnl # Check if cc supports -fno-omit-frame-pointer option. dnl # diff --git a/config/zfs-build.m4 b/config/zfs-build.m4 index d14a6bb7ac..bb10bec040 100644 --- a/config/zfs-build.m4 +++ b/config/zfs-build.m4 @@ -211,10 +211,12 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS], [ ZFS_AC_CONFIG_ALWAYS_CC_NO_CLOBBERED ZFS_AC_CONFIG_ALWAYS_CC_INFINITE_RECURSION + ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_INFINITE_RECURSION ZFS_AC_CONFIG_ALWAYS_CC_IMPLICIT_FALLTHROUGH ZFS_AC_CONFIG_ALWAYS_CC_FRAME_LARGER_THAN ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_TRUNCATION ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_ZERO_LENGTH + ZFS_AC_CONFIG_ALWAYS_CC_FORMAT_OVERFLOW ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER ZFS_AC_CONFIG_ALWAYS_CC_NO_IPA_SRA ZFS_AC_CONFIG_ALWAYS_CC_ASAN diff --git a/lib/libnvpair/libnvpair.c b/lib/libnvpair/libnvpair.c index 4842322674..a75e731673 100644 --- a/lib/libnvpair/libnvpair.c +++ b/lib/libnvpair/libnvpair.c @@ -199,6 +199,17 @@ nvprint_##type_and_variant(nvlist_prtctl_t pctl, void *private, \ return (1); \ } +/* + * Workaround for GCC 12+ with UBSan enabled deficencies. + * + * GCC 12+ invoked with -fsanitize=undefined incorrectly reports the code + * below as violating -Wformat-overflow. + */ +#if defined(__GNUC__) && !defined(__clang__) && \ + defined(ZFS_UBSAN_ENABLED) && defined(HAVE_FORMAT_OVERFLOW) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-overflow" +#endif NVLIST_PRTFUNC(boolean, int, int, "%d") NVLIST_PRTFUNC(boolean_value, boolean_t, int, "%d") NVLIST_PRTFUNC(byte, uchar_t, uchar_t, "0x%2.2x") @@ -213,6 +224,10 @@ NVLIST_PRTFUNC(uint64, uint64_t, u_longlong_t, "0x%llx") NVLIST_PRTFUNC(double, double, double, "0x%f") NVLIST_PRTFUNC(string, char *, char *, "%s") NVLIST_PRTFUNC(hrtime, hrtime_t, hrtime_t, "0x%llx") +#if defined(__GNUC__) && !defined(__clang__) && \ + defined(ZFS_UBSAN_ENABLED) && defined(HAVE_FORMAT_OVERFLOW) +#pragma GCC diagnostic pop +#endif /* * Generate functions to print array-valued nvlist members. diff --git a/lib/libzfs/libzfs_sendrecv.c b/lib/libzfs/libzfs_sendrecv.c index 3e9f637774..b53acdcea7 100644 --- a/lib/libzfs/libzfs_sendrecv.c +++ b/lib/libzfs/libzfs_sendrecv.c @@ -1007,8 +1007,23 @@ send_print_verbose(FILE *fout, const char *tosnap, const char *fromsnap, (void) fprintf(fout, dgettext(TEXT_DOMAIN, "incremental\t%s\t%s"), fromsnap, tosnap); } else { +/* + * Workaround for GCC 12+ with UBSan enabled deficencies. + * + * GCC 12+ invoked with -fsanitize=undefined incorrectly reports the code + * below as violating -Wformat-overflow. + */ +#if defined(__GNUC__) && !defined(__clang__) && \ + defined(ZFS_UBSAN_ENABLED) && defined(HAVE_FORMAT_OVERFLOW) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-overflow" +#endif (void) fprintf(fout, dgettext(TEXT_DOMAIN, "full\t%s"), tosnap); +#if defined(__GNUC__) && !defined(__clang__) && \ + defined(ZFS_UBSAN_ENABLED) && defined(HAVE_FORMAT_OVERFLOW) +#pragma GCC diagnostic pop +#endif } (void) fprintf(fout, "\t%llu", (longlong_t)size); } else { @@ -1028,8 +1043,23 @@ send_print_verbose(FILE *fout, const char *tosnap, const char *fromsnap, if (size != 0) { char buf[16]; zfs_nicebytes(size, buf, sizeof (buf)); +/* + * Workaround for GCC 12+ with UBSan enabled deficencies. + * + * GCC 12+ invoked with -fsanitize=undefined incorrectly reports the code + * below as violating -Wformat-overflow. + */ +#if defined(__GNUC__) && !defined(__clang__) && \ + defined(ZFS_UBSAN_ENABLED) && defined(HAVE_FORMAT_OVERFLOW) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-overflow" +#endif (void) fprintf(fout, dgettext(TEXT_DOMAIN, " estimated size is %s"), buf); +#if defined(__GNUC__) && !defined(__clang__) && \ + defined(ZFS_UBSAN_ENABLED) && defined(HAVE_FORMAT_OVERFLOW) +#pragma GCC diagnostic pop +#endif } } (void) fprintf(fout, "\n"); diff --git a/module/icp/algs/blake3/blake3.c b/module/icp/algs/blake3/blake3.c index 604e05847e..8e441f454a 100644 --- a/module/icp/algs/blake3/blake3.c +++ b/module/icp/algs/blake3/blake3.c @@ -276,7 +276,7 @@ static size_t compress_parents_parallel(const blake3_ops_t *ops, const uint8_t *child_chaining_values, size_t num_chaining_values, const uint32_t key[8], uint8_t flags, uint8_t *out) { - const uint8_t *parents_array[MAX_SIMD_DEGREE_OR_2]; + const uint8_t *parents_array[MAX_SIMD_DEGREE_OR_2] = {0}; size_t parents_array_len = 0; while (num_chaining_values - (2 * parents_array_len) >= 2) { diff --git a/module/lua/ldo.c b/module/lua/ldo.c index 6bef80514c..e2a3d0279d 100644 --- a/module/lua/ldo.c +++ b/module/lua/ldo.c @@ -170,7 +170,8 @@ static void seterrorobj (lua_State *L, int errcode, StkId oldtop) { /* * Silence infinite recursion warning which was added to -Wall in gcc 12.1 */ -#if defined(HAVE_INFINITE_RECURSION) +#if defined(__GNUC__) && !defined(__clang__) && \ + defined(HAVE_KERNEL_INFINITE_RECURSION) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Winfinite-recursion" #endif diff --git a/module/os/linux/zfs/zio_crypt.c b/module/os/linux/zfs/zio_crypt.c index 6f2bf7ed75..a9043ae4dc 100644 --- a/module/os/linux/zfs/zio_crypt.c +++ b/module/os/linux/zfs/zio_crypt.c @@ -229,7 +229,24 @@ zio_crypt_key_init(uint64_t crypt, zio_crypt_key_t *key) ASSERT(key != NULL); ASSERT3U(crypt, <, ZIO_CRYPT_FUNCTIONS); +/* + * Workaround for GCC 12+ with UBSan enabled deficencies. + * + * GCC 12+ invoked with -fsanitize=undefined incorrectly reports the code + * below as violating -Warray-bounds + */ +#if defined(__GNUC__) && !defined(__clang__) && \ + ((!defined(_KERNEL) && defined(ZFS_UBSAN_ENABLED)) || \ + defined(CONFIG_UBSAN)) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Warray-bounds" +#endif keydata_len = zio_crypt_table[crypt].ci_keylen; +#if defined(__GNUC__) && !defined(__clang__) && \ + ((!defined(_KERNEL) && defined(ZFS_UBSAN_ENABLED)) || \ + defined(CONFIG_UBSAN)) +#pragma GCC diagnostic pop +#endif memset(key, 0, sizeof (zio_crypt_key_t)); rw_init(&key->zk_salt_lock, NULL, RW_DEFAULT, NULL);