[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <3ee8406b-1789-4a18-8637-120fc0c62a99@linuxfoundation.org>
Date: Wed, 31 Dec 2025 13:31:20 -0700
From: Shuah Khan <skhan@...uxfoundation.org>
To: Wake Liu <wakel@...gle.com>, tglx@...utronix.de, kees@...nel.org,
shuah@...nel.org, nathan@...nel.org
Cc: luto@...capital.net, wad@...omium.org, nick.desaulniers+lkml@...il.com,
morbo@...gle.com, justinstitt@...gle.com, linux-kselftest@...r.kernel.org,
linux-kernel@...r.kernel.org, llvm@...ts.linux.dev,
Shuah Khan <skhan@...uxfoundation.org>
Subject: Re: [PATCH] kselftest/harness: Use helper to avoid zero-size memset
warning
On 12/24/25 01:41, Wake Liu wrote:
> When building kselftests with a toolchain that enables source
> fortification (e.g., Android's build environment, which uses
> -D_FORTIFY_SOURCE=3), a build failure occurs in tests that use an
> empty FIXTURE().
>
> The root cause is that an empty fixture struct results in
> `sizeof(self_private)` evaluating to 0. The compiler's fortification
> checks then detect the `memset()` call with a compile-time constant size
> of 0, issuing a `-Wuser-defined-warnings` which is promoted to an error
> by `-Werror`.
>
> An initial attempt to guard the call with `if (sizeof(self_private) > 0)`
> was insufficient. The compiler's static analysis is aggressive enough
> to flag the `memset(..., 0)` pattern before evaluating the conditional,
> thus still triggering the error.
>
> To resolve this robustly, this change introduces a `static inline`
> helper function, `__kselftest_memset_safe()`. This function wraps the
> size check and the `memset()` call. By replacing the direct `memset()`
> in the `__TEST_F_IMPL` macro with a call to this helper, we create an
> abstraction boundary. This prevents the compiler's static analyzer from
> "seeing" the problematic pattern at the macro expansion site, resolving
> the build failure.
>
> Build Context:
> Compiler: Android (14488419, +pgo, +bolt, +lto, +mlgo, based on r584948) clang version 22.0.0 (https://android.googlesource.com/toolchain/llvm-project 2d65e4108033380e6fe8e08b1f1826cd2bfb0c99)
> Relevant Options: -O2 -Wall -Werror -D_FORTIFY_SOURCE=3 -target i686-linux-android10000
>
> Test: m kselftest_futex_futex_requeue_pi
>
> Change-Id: If4fdfe6ffcbe9736fbd8f66b2453e8cbbb95e25e
I removed this before applying. In the future remove these
before sending the patch - running checkpatch.pl prompts
you to remove it.
> Signed-off-by: Wake Liu <wakel@...gle.com>
> ---
> tools/testing/selftests/kselftest_harness.h | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h
> index 3f66e862e83eb..159cd6729af33 100644
> --- a/tools/testing/selftests/kselftest_harness.h
> +++ b/tools/testing/selftests/kselftest_harness.h
> @@ -70,6 +70,12 @@
>
> #include "kselftest.h"
>
> +static inline void __kselftest_memset_safe(void *s, int c, size_t n)
> +{
> + if (n > 0)
> + memset(s, c, n);
> +}
> +
> #define TEST_TIMEOUT_DEFAULT 30
>
> /* Utilities exposed to the test definitions */
> @@ -416,7 +422,7 @@
> self = mmap(NULL, sizeof(*self), PROT_READ | PROT_WRITE, \
> MAP_SHARED | MAP_ANONYMOUS, -1, 0); \
> } else { \
> - memset(&self_private, 0, sizeof(self_private)); \
> + __kselftest_memset_safe(&self_private, 0, sizeof(self_private)); \
> self = &self_private; \
> } \
> } \
Applied to linux-kselftest fixes branch for next rc.
thanks,
-- Shuah
Powered by blists - more mailing lists