mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-07 06:43:00 +03:00
assert.h: allow gcc to detect assert(a = 1) errors
* assert/assert.h (assert): Rewrite assert's definition so that a s/==/=/ typo, e.g., assert(errno = ENOENT) is not hidden from gcc's -Wparentheses by assert-added parentheses. The new definition uses "if (expr) /* empty */; else __assert_fail...", so gcc -Wall will now detect that type of error in an assert, too. The __STRICT_ANSI__ disjunct is to make this work also with both -ansi and -pedantic, which would reject the use of ({...}). I would have preferred to use __extension__ to mark that, but doing so would mistakenly suppress warnings about any extension in the user-supplied "expr". E.g., "assert ( ({1;}) )" must continue to evoke a warning.
This commit is contained in:
@@ -1,3 +1,11 @@
|
|||||||
|
2016-11-25 Jim Meyering <meyering@fb.com>
|
||||||
|
|
||||||
|
Let gcc detect assert(a = 1) errors.
|
||||||
|
* assert/assert.h (assert) Rewrite, retaining the old definintion
|
||||||
|
when required, but otherwise putting the expression as-is in an "if"
|
||||||
|
expression (hence, with no added parentheses) within a statement
|
||||||
|
expression.
|
||||||
|
|
||||||
2016-12-17 Siddhesh Poyarekar <siddhesh@sourceware.org>
|
2016-12-17 Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
|
||||||
* benchtests/Makefile (binaries-benchset): Depend on libsupport
|
* benchtests/Makefile (binaries-benchset): Depend on libsupport
|
||||||
|
@@ -82,10 +82,23 @@ extern void __assert (const char *__assertion, const char *__file, int __line)
|
|||||||
|
|
||||||
__END_DECLS
|
__END_DECLS
|
||||||
|
|
||||||
# define assert(expr) \
|
/* When possible, define assert so that it does not add extra
|
||||||
((expr) \
|
parentheses around EXPR. Otherwise, those added parentheses would
|
||||||
? __ASSERT_VOID_CAST (0) \
|
suppress warnings we'd expect to be detected by gcc's -Wparentheses. */
|
||||||
: __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))
|
# if !defined __GNUC__ || defined __STRICT_ANSI__
|
||||||
|
# define assert(expr) \
|
||||||
|
((expr) \
|
||||||
|
? __ASSERT_VOID_CAST (0) \
|
||||||
|
: __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))
|
||||||
|
# else
|
||||||
|
# define assert(expr) \
|
||||||
|
({ \
|
||||||
|
if (expr) \
|
||||||
|
; /* empty */ \
|
||||||
|
else \
|
||||||
|
__assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION); \
|
||||||
|
})
|
||||||
|
# endif
|
||||||
|
|
||||||
# ifdef __USE_GNU
|
# ifdef __USE_GNU
|
||||||
# define assert_perror(errnum) \
|
# define assert_perror(errnum) \
|
||||||
|
Reference in New Issue
Block a user