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

Chunyu Hu
2026-04-01T13:32:54Z

On Tue, Mar 31, 2026 at 12:09:02PM -0700, Andrew Morton wrote:
> On Tue, 31 Mar 2026 18:31:42 +0800 Chunyu Hu <chuhu@redhat.com> wrote:
>
> > > - 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.
>
> I like vasprintf()!
>
> "#define _GNU_SOURCE" occurs 402 times in selftests/, so perhaps we can
> find a way to keep it?
>
> (err, *why* 402 times? Can't it be just once?)
>

_GNU_SOURCE is a feature macro, may silently cause troubles if defined
globally and it's recommended to be used explicitly and maybe that's why
we have so many definitions in c files. It's usually requireed to be
defined on the top of the include file list of c file. So although we
can see kselftest_harness.h defined _GNU_SOURCE, but still can see some
many (80+) c files define _GNU_SOURCE on the top and include
"kselftest_harness.h" at same file in the bottom of the include files list.

So the side efffect of using the vasprintf in kselftest.h is user need
to take care of _GNU_SOURCE definition because a header requries that...
and the header may change something silently because of the _GNU_SOURCE.

And a weird thing is _GNU_SOURCE is not defined, but the compile of
the selftests calling the ksft_exit_fail_perror(vasprintf) succeed by
accident, maybe man page need update or something I missed.

As Mark and Thomas mentioned, the root cause is not this macro's lack
of definition, it's when '-nostdlib' is specified in the compile flag,
the nolibc lib don't have the fallback implement.

So it may be not appropriate to use it in the kselftest.h. And
considering if we use a buf[], the size is limited and the message
could be truncated, still not ideal.