This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] assert.h: allow gcc to detect assert(a = 1) errors
- From: Jim Meyering <jim at meyering dot net>
- To: libc-alpha at sourceware dot org
- Cc: Roland McGrath <roland at hack dot frob dot com>
- Date: Wed, 16 Jul 2014 12:12:03 -0700
- Subject: [PATCH] assert.h: allow gcc to detect assert(a = 1) errors
- Authentication-results: sourceware.org; auth=none
From: Jim Meyering <meyering@fb.com>
* 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 the parentheses added by assert.
The new definition uses "if (expr) ; else __assert_fail...", so
gcc -Wall will now detect that type of error in an assert, too.
---
assert/assert.h | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/assert/assert.h b/assert/assert.h
index 2661391..ffcf60c 100644
--- a/assert/assert.h
+++ b/assert/assert.h
@@ -82,10 +82,23 @@ extern void __assert (const char *__assertion, const char *__file, int __line)
__END_DECLS
-# define assert(expr) \
- ((expr) \
- ? __ASSERT_VOID_CAST (0) \
- : __assert_fail (__STRING(expr), __FILE__, __LINE__, __ASSERT_FUNCTION))
+/* When possible, define assert so that it does not add extra
+ parentheses around EXPR. Otherwise, those added parentheses would
+ suppress warnings we'd expect to be detected by gcc's -Wparentheses. */
+# if !defined __GNUC__ || defined __STRICT_ANSI__
+# define assert(expr) \
+ ((expr) \
+ ? __ASSERT_VOID_CAST (0) \
+ : __assert_fail (__STRING(expr), __FILE__, __LINE__, __ASSERT_FUNCTION))
+# else
+# define assert(expr) \
+ ({ \
+ if (expr) \
+ ; /* empty */ \
+ else \
+ __assert_fail (__STRING(expr), __FILE__, __LINE__, __ASSERT_FUNCTION);\
+ })
+# endif
# ifdef __USE_GNU
# define assert_perror(errnum) \
--
2.0.1