On Tue, Mar 31, 2026 at 12:09:02PM -0700, Andrew Morton wrote: > On Tue, 31 Mar 2026 18:31:42 +0800 Chunyu Hu <[email protected]> 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.

