]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
DEBUG: cleanup BUG_ON() configuration
authorWilly Tarreau <w@1wt.eu>
Fri, 25 Feb 2022 07:45:52 +0000 (08:45 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 25 Feb 2022 10:55:47 +0000 (11:55 +0100)
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.

include/haproxy/bug.h

index a360d5b1abd5c7ce2dfd361741558044163de129..ddf55e8057e719aebf51b691f53f06d0bd871019 100644 (file)
 #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