lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<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

Powered by Openwall GNU/*/Linux Powered by OpenVZ