Re: [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments

Chunyu Hu
2026-03-31T10:32:04Z

On Mon, Mar 30, 2026 at 11:15:00PM +0800, Chunyu Hu wrote:
> The ksft_exit_fail_perror function previously only accepted a single string
> argument, which limited its flexibility for providing specific context to
> failure messages.
>
> This change updates ksft_exit_fail_perror to support variable arguments,
> similar to ksft_exit_fail_msg. Adding the __printf(1, 2) attribute enables
> compile-time checking for format string correctness.
>
> Signed-off-by: Chunyu Hu <chuhu@redhat.com>
> ---
> Changes in v7:
> - new patch to convert ksft_exit_fail_perror support variable arguments
> ---
> tools/testing/selftests/kselftest.h | 21 ++++++++++++++++++---
> 1 file changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/tools/testing/selftests/kselftest.h b/tools/testing/selftests/kselftest.h
> index afbcf8412ae5..11cabdabb3f6 100644
> --- a/tools/testing/selftests/kselftest.h
> +++ b/tools/testing/selftests/kselftest.h
> @@ -43,7 +43,7 @@
> * the program is aborting before finishing all tests):
> *
> * ksft_exit_fail_msg(fmt, ...);
> - * ksft_exit_fail_perror(msg);
> + * ksft_exit_fail_perror(fmt, ...);
> *
> */
> #ifndef __KSELFTEST_H
> @@ -417,9 +417,24 @@ static inline __noreturn __printf(1, 2) void ksft_exit_fail_msg(const char *msg,
> exit(KSFT_FAIL);
> }
>
> -static inline __noreturn void ksft_exit_fail_perror(const char *msg)
> +static inline __noreturn __printf(1, 2) void ksft_exit_fail_perror(const char *msg, ...)
> {
> - ksft_exit_fail_msg("%s: %s (%d)\n", msg, strerror(errno), errno);
> + va_list args;
> + char *buf = NULL;
> + int saved_errno = errno;
> +
> + va_start(args, msg);
> + if (vasprintf(&buf, msg, args) == -1) {

kernel test robot reported compile error on this, as the vasprintf
required _GNU_SOURCE. Looks like it's not appropriate to be used
in the common header. Looks like it can be replaced with a buf and
vsnprintf instead.

char buf[512];
va_start(args, msg);
vsnprintf(buf, sizeof(buf), msg, args);

```
In file included from za-fork.c:12:
../../kselftest.h: In function 'ksft_exit_fail_perror':
>> ../../kselftest.h:427:13: error: implicit declaration of function 'vasprintf'; did you mean 'vsprintf'? [-Wimplicit-function-declaration]
427 | if (vasprintf(&buf, msg, args) == -1) {
| ^~~~~~~~~
| vsprintf
--
In file included from basic-gcs.c:16:
tools/testing/selftests/kselftest.h: In function 'ksft_exit_fail_perror':
>> tools/testing/selftests/kselftest.h:427:13: error: implicit declaration of function 'vasprintf'; did you mean 'vsprintf'? [-Wimplicit-function-declaration]
427 | if (vasprintf(&buf, msg, args) == -1) {
| ^~~~~~~~~
| vsprintf
```

> + va_end(args);
> + ksft_exit_fail_msg("vasprintf failed: %s (%d)\n", strerror(saved_errno),
> + saved_errno);
> + }
> + va_end(args);
> +
> + errno = saved_errno;
> + ksft_exit_fail_msg("%s: %s (%d)\n", buf, strerror(errno), errno);
> +
> + free(buf);
> }
>
> static inline __noreturn void ksft_exit_xfail(void)
> --
> 2.53.0
>