]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
tools/nolibc: avoid false-positive -Wmaybe-uninitialized through waitpid()
authorThomas Weißschuh <thomas.weissschuh@linutronix.de>
Mon, 7 Jul 2025 12:58:11 +0000 (14:58 +0200)
committerThomas Weißschuh <linux@weissschuh.net>
Mon, 7 Jul 2025 13:24:35 +0000 (15:24 +0200)
The compiler does not know that waitid() will only ever return 0 or -1.
If waitid() would return a positive value than waitpid() would return that
same value and *status would not be initialized.
However users calling waitpid() know that the only possible return values
of it are 0 or -1. They therefore might check for errors with
'ret == -1' or 'ret < 0' and use *status otherwise. The compiler will then
warn about the usage of a potentially uninitialized variable.

Example:

$ cat test.c
#include <stdio.h>
#include <unistd.h>

int main(void)
{
int ret, status;

ret = waitpid(0, &status, 0);
if (ret == -1)
return 0;

printf("status %x\n", status);

return 0;
}

$ gcc --version
gcc (GCC) 15.1.1 20250425

$ gcc -Wall -Os -Werror -nostdlib -nostdinc -static -Iusr/include -Itools/include/nolibc/ -o /dev/null test.c
test.c: In function ‘main’:
test.c:12:9: error: ‘status’ may be used uninitialized [-Werror=maybe-uninitialized]
   12 |         printf("status %x\n", status);
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.c:6:18: note: ‘status’ was declared here
    6 |         int ret, status;
      |                  ^~~~~~
cc1: all warnings being treated as errors

Avoid the warning by normalizing waitid() errors to '-1' in waitpid().

Fixes: 0c89abf5ab3f ("tools/nolibc: implement waitpid() in terms of waitid()")
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Acked-by: Willy Tarreau <w@1wt.eu>
Link: https://lore.kernel.org/r/20250707-nolibc-waitpid-uninitialized-v1-1-dcd4e70bcd8f@linutronix.de
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
tools/include/nolibc/sys/wait.h

index 4d44e3da0ba814d00368027d893e2eb1155b86f3..56ddb806da7f2466be5523b52fd01480b711daec 100644 (file)
@@ -78,7 +78,7 @@ pid_t waitpid(pid_t pid, int *status, int options)
 
        ret = waitid(idtype, id, &info, options);
        if (ret)
-               return ret;
+               return -1;
 
        switch (info.si_code) {
        case 0: