• Nathan Chancellor's avatar
    selftests: kselftest: Mark functions that unconditionally call exit() as __noreturn · f7d5bcd3
    Nathan Chancellor authored
    After commit 6d029c25 ("selftests/timers/posix_timers: Reimplement
    check_timer_distribution()"), clang warns:
    
      tools/testing/selftests/timers/../kselftest.h:398:6: warning: variable 'major' is used uninitialized whenever '||' condition is true [-Wsometimes-uninitialized]
        398 |         if (uname(&info) || sscanf(info.release, "%u.%u.", &major, &minor) != 2)
            |             ^~~~~~~~~~~~
      tools/testing/selftests/timers/../kselftest.h:401:9: note: uninitialized use occurs here
        401 |         return major > min_major || (major == min_major && minor >= min_minor);
            |                ^~~~~
      tools/testing/selftests/timers/../kselftest.h:398:6: note: remove the '||' if its condition is always false
        398 |         if (uname(&info) || sscanf(info.release, "%u.%u.", &major, &minor) != 2)
            |             ^~~~~~~~~~~~~~~
      tools/testing/selftests/timers/../kselftest.h:395:20: note: initialize the variable 'major' to silence this warning
        395 |         unsigned int major, minor;
            |                           ^
            |                            = 0
    
    This is a false positive because if uname() fails, ksft_exit_fail_msg()
    will be called, which unconditionally calls exit(), a noreturn function.
    However, clang does not know that ksft_exit_fail_msg() will call exit() at
    the point in the pipeline that the warning is emitted because inlining has
    not occurred, so it assumes control flow will resume normally after
    ksft_exit_fail_msg() is called.
    
    Make it clear to clang that all of the functions that call exit()
    unconditionally in kselftest.h are noreturn transitively by marking them
    explicitly with '__attribute__((__noreturn__))', which clears up the
    warning above and any future warnings that may appear for the same reason.
    
    Fixes: 6d029c25 ("selftests/timers/posix_timers: Reimplement check_timer_distribution()")
    Reported-by: default avatarJohn Stultz <jstultz@google.com>
    Signed-off-by: default avatarNathan Chancellor <nathan@kernel.org>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Acked-by: default avatarShuah Khan <skhan@linuxfoundation.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20240411-mark-kselftest-exit-funcs-noreturn-v1-1-b027c948f586@kernel.org
    Closes: https://lore.kernel.org/all/20240410232637.4135564-2-jstultz@google.com/
    f7d5bcd3
kselftest.h 9.89 KB