From: Willy Tarreau Date: Fri, 25 Feb 2022 07:45:52 +0000 (+0100) Subject: DEBUG: cleanup BUG_ON() configuration X-Git-Tag: v2.6-dev2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=be0dbba6ecda5c882ee4e0db4923f8a67e4a85e9;p=thirdparty%2Fhaproxy.git 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 a360d5b1ab..ddf55e8057 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 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