This informs the compiler that no code will ever run after an assertion failure (unless NDEBUG is defined), which increases accuracy of compiler warnings and static analyses.
-- v2: include/msvcrt: Add noreturn attribute to _assert.
From: Jinoh Kang jinoh.kang.kr@gmail.com
This informs the compiler that no code will ever run after an assertion failure (unless NDEBUG is defined), which increases accuracy of compiler warnings and static analyses. --- dlls/msvcrt/exit.c | 4 ++-- dlls/ntdll/exception.c | 4 ++-- include/msvcrt/assert.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/dlls/msvcrt/exit.c b/dlls/msvcrt/exit.c index 6427b15bece..266b7d06b28 100644 --- a/dlls/msvcrt/exit.c +++ b/dlls/msvcrt/exit.c @@ -290,7 +290,7 @@ unsigned int CDECL _set_abort_behavior(unsigned int flags, unsigned int mask) /********************************************************************* * _wassert (MSVCRT.@) */ -void CDECL _wassert(const wchar_t* str, const wchar_t* file, unsigned int line) +DECLSPEC_NORETURN void CDECL _wassert(const wchar_t* str, const wchar_t* file, unsigned int line) { TRACE("(%s,%s,%d)\n", debugstr_w(str), debugstr_w(file), line);
@@ -311,7 +311,7 @@ void CDECL _wassert(const wchar_t* str, const wchar_t* file, unsigned int line) /********************************************************************* * _assert (MSVCRT.@) */ -void CDECL _assert(const char* str, const char* file, unsigned int line) +DECLSPEC_NORETURN void CDECL _assert(const char* str, const char* file, unsigned int line) { wchar_t strW[1024], fileW[1024];
diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index 556b424ac6e..5c2133919f0 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -623,10 +623,10 @@ PRUNTIME_FUNCTION WINAPI RtlLookupFunctionEntry( ULONG_PTR pc, ULONG_PTR *base, /************************************************************* * _assert */ -void __cdecl _assert( const char *str, const char *file, unsigned int line ) +DECLSPEC_NORETURN void __cdecl _assert( const char *str, const char *file, unsigned int line ) { ERR( "%s:%u: Assertion failed %s\n", file, line, debugstr_a(str) ); - RtlRaiseStatus( EXCEPTION_WINE_ASSERTION ); + for (;;) RtlRaiseStatus( EXCEPTION_WINE_ASSERTION ); }
diff --git a/include/msvcrt/assert.h b/include/msvcrt/assert.h index 9a180f7e58d..26a9c0a7a5f 100644 --- a/include/msvcrt/assert.h +++ b/include/msvcrt/assert.h @@ -28,7 +28,7 @@ extern "C" { #ifdef NDEBUG #define assert(_expr) ((void)0) #else -_ACRTIMP void __cdecl _assert(const char *, const char *, unsigned int); +_ACRTIMP DECLSPEC_NORETURN void __cdecl _assert(const char *, const char *, unsigned int); #define assert(_expr) (void)((!!(_expr)) || (_assert(#_expr, __FILE__, __LINE__), 0)) #endif
Zebediah Figura (@zfigura) commented about dlls/ntdll/exception.c:
/*************************************************************
_assert
*/ -void __cdecl _assert( const char *str, const char *file, unsigned int line ) +DECLSPEC_NORETURN void __cdecl _assert( const char *str, const char *file, unsigned int line ) { ERR( "%s:%u: Assertion failed %s\n", file, line, debugstr_a(str) );
- RtlRaiseStatus( EXCEPTION_WINE_ASSERTION );
- for (;;) RtlRaiseStatus( EXCEPTION_WINE_ASSERTION );
Probably RtlRaiseStatus() also deserves DECLSPEC_NORETURN.