mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-14 07:03:44 +01:00
Introduce tor_assertf() to allow logging extra error message on assert failure
With format string support!
This commit is contained in:
parent
c5da1f1cd5
commit
f236c9e7f9
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user