Introduce tor_assertf() to allow logging extra error message on assert failure

With format string support!
This commit is contained in:
rl1987 2018-03-18 14:56:59 +01:00
parent c5da1f1cd5
commit f236c9e7f9
2 changed files with 26 additions and 7 deletions

View File

@ -70,14 +70,25 @@ tor_set_failed_assertion_callback(void (*fn)(void))
/** Helper for tor_assert: report the assertion failure. */ /** Helper for tor_assert: report the assertion failure. */
void void
tor_assertion_failed_(const char *fname, unsigned int line, tor_assertion_failed_(const char *fname, unsigned int line,
const char *func, const char *expr) const char *func, const char *expr,
const char *fmt, ...)
{ {
char buf[256]; char buf[256];
char *extra = NULL;
va_list ap;
if (fmt) {
va_start(ap,fmt);
tor_vasprintf(&extra, fmt, ap);
va_end(ap);
}
log_err(LD_BUG, "%s:%u: %s: Assertion %s failed; aborting.", log_err(LD_BUG, "%s:%u: %s: Assertion %s failed; aborting.",
fname, line, func, expr); fname, line, func, expr);
tor_snprintf(buf, sizeof(buf), tor_snprintf(buf, sizeof(buf),
"Assertion %s failed in %s at %s:%u", "Assertion %s failed in %s at %s:%u: %s",
expr, func, fname, line); expr, func, fname, line, extra ? extra : "");
tor_free(extra);
log_backtrace(LOG_ERR, LD_BUG, buf); log_backtrace(LOG_ERR, LD_BUG, buf);
} }

View File

@ -92,13 +92,20 @@
#define tor_assert(a) STMT_BEGIN \ #define tor_assert(a) STMT_BEGIN \
(void)(a); \ (void)(a); \
STMT_END STMT_END
#define tor_assertf(a, fmt, ...) STMT_BEGIN \
(void)(a); \
(void)(fmt); \
STMT_END
#else #else
/** Like assert(3), but send assertion failures to the log as well as to /** Like assert(3), but send assertion failures to the log as well as to
* stderr. */ * stderr. */
#define tor_assert(expr) STMT_BEGIN \ #define tor_assert(expr) tor_assertf(expr, NULL)
#define tor_assertf(expr, fmt, ...) STMT_BEGIN \
if (ASSERT_PREDICT_LIKELY_(expr)) { \ if (ASSERT_PREDICT_LIKELY_(expr)) { \
} else { \ } else { \
tor_assertion_failed_(SHORT_FILE__, __LINE__, __func__, #expr); \ tor_assertion_failed_(SHORT_FILE__, __LINE__, __func__, #expr, \
fmt, ##__VA_ARGS__); \
abort(); \ abort(); \
} STMT_END } STMT_END
#endif /* defined(TOR_UNIT_TESTS) && defined(DISABLE_ASSERTS_IN_UNIT_TESTS) */ #endif /* defined(TOR_UNIT_TESTS) && defined(DISABLE_ASSERTS_IN_UNIT_TESTS) */
@ -106,7 +113,7 @@
#define tor_assert_unreached() \ #define tor_assert_unreached() \
STMT_BEGIN { \ STMT_BEGIN { \
tor_assertion_failed_(SHORT_FILE__, __LINE__, __func__, \ tor_assertion_failed_(SHORT_FILE__, __LINE__, __func__, \
"line should be unreached"); \ "line should be unreached", NULL); \
abort(); \ abort(); \
} STMT_END } STMT_END
@ -221,7 +228,8 @@
#define tor_fragile_assert() tor_assert_nonfatal_unreached_once() #define tor_fragile_assert() tor_assert_nonfatal_unreached_once()
void tor_assertion_failed_(const char *fname, unsigned int line, void tor_assertion_failed_(const char *fname, unsigned int line,
const char *func, const char *expr); const char *func, const char *expr,
const char *fmt, ...);
void tor_bug_occurred_(const char *fname, unsigned int line, void tor_bug_occurred_(const char *fname, unsigned int line,
const char *func, const char *expr, const char *func, const char *expr,
int once); int once);