diff --git a/src/common/log.c b/src/common/log.c index 7ba669818f..2f5fdbc17d 100644 --- a/src/common/log.c +++ b/src/common/log.c @@ -50,8 +50,6 @@ #define TRUNCATED_STR_LEN 14 /** @} */ -#define raw_assert(x) assert(x) // assert OK - /** Defining compile-time constants for Tor log levels (used by the Rust * log wrapper at src/rust/tor_log) */ const int LOG_WARN_ = LOG_WARN; @@ -89,9 +87,9 @@ sev_to_string(int severity) case LOG_NOTICE: return "notice"; case LOG_WARN: return "warn"; case LOG_ERR: return "err"; - default: /* Call assert, not tor_assert, since tor_assert - * calls log on failure. */ - raw_assert(0); return "UNKNOWN"; // LCOV_EXCL_LINE + default: /* Call assert, not tor_assert, since tor_assert + * calls log on failure. */ + raw_assert_unreached(); return "UNKNOWN"; // LCOV_EXCL_LINE } } @@ -1536,4 +1534,3 @@ truncate_logs(void) } } } - diff --git a/src/common/util_bug.h b/src/common/util_bug.h index 70a28eb156..0e1af2da14 100644 --- a/src/common/util_bug.h +++ b/src/common/util_bug.h @@ -55,6 +55,21 @@ #error "Sorry; we don't support building with NDEBUG." #endif /* defined(NDEBUG) */ +/* The raw_assert...() variants are for use within code that can't call + * tor_assertion_failed_() because of call circularity issues. */ +#define raw_assert(expr) STMT_BEGIN \ + if (!(expr)) { \ + fprintf(stderr, "RAW ASSERTION FAILURE AT %s:%d: %s\n", \ + __FILE__, __LINE__, #expr); \ + abort(); \ + } \ + STMT_END +#define raw_assert_unreached(expr) raw_assert(0) +#define raw_assert_unreached_msg(msg) STMT_BEGIN \ + fprintf(stderr, "ERROR: %s\n", (msg)); \ + raw_assert_unreached(); \ + STMT_END + /* Sometimes we don't want to use assertions during branch coverage tests; it * leads to tons of unreached branches which in reality are only assertions we * didn't hit. */ @@ -199,4 +214,3 @@ void tor_set_failed_assertion_callback(void (*fn)(void)); #endif /* defined(TOR_UNIT_TESTS) */ #endif /* !defined(TOR_UTIL_BUG_H) */ -