DEBUG: cleanup BUG_ON() configuration
The BUG_ON() macro handling is complicated because it relies on a
conditional CRASH_NOW() macro whose definition depends on DEBUG_STRICT
and DEBUG_STRICT_NOCRASH. Let's rethink the whole thing differently,
and instead make the underlying _BUG_ON() macro take a crash argument
to decide whether to crash or not, as well as a prefix and a suffix for
the message, that will allow to distinguish between variants. Now the
suffix is set to a message explaining we don't crash when needed.
This also allows to get rid of the CRASH_NOW() macro and to define
much simpler new macros.
diff --git a/include/haproxy/bug.h b/include/haproxy/bug.h
index a360d5b..ddf55e8 100644
--- a/include/haproxy/bug.h
+++ b/include/haproxy/bug.h
@@ -50,29 +50,34 @@
#define ABORT_NOW() do { DUMP_TRACE(); (*(volatile int*)1=0); } while (0)
#endif
+/* This is the generic low-level macro dealing with conditional warnings and
+ * bugs. The caller decides whether to crash or not and what prefix and suffix
+ * to pass.
+ */
+#define _BUG_ON(cond, file, line, crash, pfx, sfx) \
+ __BUG_ON(cond, file, line, crash, pfx, sfx)
+
+#define __BUG_ON(cond, file, line, crash, pfx, sfx) \
+ do { \
+ if (unlikely(cond)) { \
+ const char msg[] = "\n" pfx "condition \"" #cond "\" matched at " file ":" #line "" sfx "\n"; \
+ DISGUISE(write(2, msg, __builtin_strlen(msg))); \
+ if (crash) \
+ ABORT_NOW(); \
+ else \
+ DUMP_TRACE(); \
+ } \
+ } while (0)
+
/* BUG_ON: complains if <cond> is true when DEBUG_STRICT or DEBUG_STRICT_NOCRASH
* are set, does nothing otherwise. With DEBUG_STRICT in addition it immediately
* crashes using ABORT_NOW() above.
*/
-#if defined(DEBUG_STRICT) || defined(DEBUG_STRICT_NOCRASH)
#if defined(DEBUG_STRICT)
-#define CRASH_NOW() ABORT_NOW()
-#else
-#define CRASH_NOW() do { DUMP_TRACE(); } while (0)
-#endif
-
-#define BUG_ON(cond) _BUG_ON(cond, __FILE__, __LINE__)
-#define _BUG_ON(cond, file, line) __BUG_ON(cond, file, line)
-#define __BUG_ON(cond, file, line) \
- do { \
- if (unlikely(cond)) { \
- const char msg[] = "\nFATAL: bug condition \"" #cond "\" matched at " file ":" #line "\n"; \
- DISGUISE(write(2, msg, __builtin_strlen(msg))); \
- CRASH_NOW(); \
- } \
- } while (0)
+#define BUG_ON(cond) _BUG_ON(cond, __FILE__, __LINE__, 1, "FATAL: bug ", "")
+#elif defined(DEBUG_STRICT_NOCRASH)
+#define BUG_ON(cond) _BUG_ON(cond, __FILE__, __LINE__, 0, "FATAL: bug ", " (not crashing but process is untrusted now)")
#else
-#undef CRASH_NOW
#define BUG_ON(cond)
#endif