Force syntax-checking on assertions even in non-asserting builds.
authorMichael Brown <mcb30@etherboot.org>
Mon, 4 Dec 2006 15:09:57 +0000 (15:09 +0000)
committerMichael Brown <mcb30@etherboot.org>
Mon, 4 Dec 2006 15:09:57 +0000 (15:09 +0000)
src/include/assert.h

index b9137fc..e76ceb9 100644 (file)
  *
  */
 
+#ifdef NDEBUG
+#define ASSERTING 0
+#else
+#define ASSERTING 1
+#endif
+
+/** printf() for assertions
+ *
+ * This function exists so that the assert() macro can expand to
+ * printf() calls without dragging the printf() prototype into scope.
+ *
+ * As far as the compiler is concerned, assert_printf() and printf() are
+ * completely unrelated calls; it's only at the assembly stage that
+ * references to the assert_printf symbol are collapsed into references
+ * to the printf symbol.
+ */
+extern int __attribute__ (( format ( printf, 1, 2 ) )) 
+assert_printf ( const char *fmt, ... ) asm ( "printf" );
+
 /**
  * Assert a condition at run-time.
  *
  */
 #define assert( condition )                                               \
        do {                                                               \
-               if ( ! (condition) ) {                                     \
-                       printf ( "assert(%s) failed at %s line %d [%s]\n", \
-                                #condition, __FILE__, __LINE__,           \
-                                __FUNCTION__ );                           \
+               if ( ASSERTING && ! (condition) ) {                        \
+                       assert_printf ( "assert(%s) failed at %s line "    \
+                                       "%d [%s]\n", #condition, __FILE__, \
+                                       __LINE__, __FUNCTION__ );          \
                }                                                          \
        } while ( 0 )
 
@@ -44,9 +63,4 @@
                 error_symbol();                                \
         }
 
-#ifdef NDEBUG
-#undef assert
-#define assert(x) do {} while ( 0 )
-#endif
-
 #endif /* _ASSERT_H */