mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	selftests: kselftest: Mark functions that unconditionally call exit() as __noreturn
After commit6d029c25b7("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:6d029c25b7("selftests/timers/posix_timers: Reimplement check_timer_distribution()") Reported-by: John Stultz <jstultz@google.com> Signed-off-by: Nathan Chancellor <nathan@kernel.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Shuah 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/
This commit is contained in:
		
							parent
							
								
									e4a6bceac9
								
							
						
					
					
						commit
						f7d5bcd35d
					
				
					 1 changed files with 9 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -80,6 +80,9 @@
 | 
			
		|||
#define KSFT_XPASS 3
 | 
			
		||||
#define KSFT_SKIP  4
 | 
			
		||||
 | 
			
		||||
#ifndef __noreturn
 | 
			
		||||
#define __noreturn       __attribute__((__noreturn__))
 | 
			
		||||
#endif
 | 
			
		||||
#define __printf(a, b)   __attribute__((format(printf, a, b)))
 | 
			
		||||
 | 
			
		||||
/* counters */
 | 
			
		||||
| 
						 | 
				
			
			@ -300,13 +303,13 @@ void ksft_test_result_code(int exit_code, const char *test_name,
 | 
			
		|||
	va_end(args);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int ksft_exit_pass(void)
 | 
			
		||||
static inline __noreturn int ksft_exit_pass(void)
 | 
			
		||||
{
 | 
			
		||||
	ksft_print_cnts();
 | 
			
		||||
	exit(KSFT_PASS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int ksft_exit_fail(void)
 | 
			
		||||
static inline __noreturn int ksft_exit_fail(void)
 | 
			
		||||
{
 | 
			
		||||
	ksft_print_cnts();
 | 
			
		||||
	exit(KSFT_FAIL);
 | 
			
		||||
| 
						 | 
				
			
			@ -333,7 +336,7 @@ static inline int ksft_exit_fail(void)
 | 
			
		|||
		  ksft_cnt.ksft_xfail +	\
 | 
			
		||||
		  ksft_cnt.ksft_xskip)
 | 
			
		||||
 | 
			
		||||
static inline __printf(1, 2) int ksft_exit_fail_msg(const char *msg, ...)
 | 
			
		||||
static inline __noreturn __printf(1, 2) int ksft_exit_fail_msg(const char *msg, ...)
 | 
			
		||||
{
 | 
			
		||||
	int saved_errno = errno;
 | 
			
		||||
	va_list args;
 | 
			
		||||
| 
						 | 
				
			
			@ -348,19 +351,19 @@ static inline __printf(1, 2) int ksft_exit_fail_msg(const char *msg, ...)
 | 
			
		|||
	exit(KSFT_FAIL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int ksft_exit_xfail(void)
 | 
			
		||||
static inline __noreturn int ksft_exit_xfail(void)
 | 
			
		||||
{
 | 
			
		||||
	ksft_print_cnts();
 | 
			
		||||
	exit(KSFT_XFAIL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int ksft_exit_xpass(void)
 | 
			
		||||
static inline __noreturn int ksft_exit_xpass(void)
 | 
			
		||||
{
 | 
			
		||||
	ksft_print_cnts();
 | 
			
		||||
	exit(KSFT_XPASS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline __printf(1, 2) int ksft_exit_skip(const char *msg, ...)
 | 
			
		||||
static inline __noreturn __printf(1, 2) int ksft_exit_skip(const char *msg, ...)
 | 
			
		||||
{
 | 
			
		||||
	int saved_errno = errno;
 | 
			
		||||
	va_list args;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue