diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2025-03-17 20:24:22 +1100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2025-03-20 20:33:24 +0100 |
commit | 9153aca15bc1150e450dd56e79bc035cc2dbf27c (patch) | |
tree | 10af0f2f7790b1ea74baa54f6c5343598ac2826f | |
parent | 38bcce997763f2e0c4bb6c0a3926674317796544 (diff) | |
download | passt-9153aca15bc1150e450dd56e79bc035cc2dbf27c.tar passt-9153aca15bc1150e450dd56e79bc035cc2dbf27c.tar.gz passt-9153aca15bc1150e450dd56e79bc035cc2dbf27c.tar.bz2 passt-9153aca15bc1150e450dd56e79bc035cc2dbf27c.tar.lz passt-9153aca15bc1150e450dd56e79bc035cc2dbf27c.tar.xz passt-9153aca15bc1150e450dd56e79bc035cc2dbf27c.tar.zst passt-9153aca15bc1150e450dd56e79bc035cc2dbf27c.zip |
util: Add abort_with_msg() and ASSERT_WITH_MSG() helpers
We already have the ASSERT() macro which will abort() passt based on a
condition. It always has a fixed error message based on its location and
the asserted expression. We have some upcoming cases where we want to
customise the message when hitting an assert.
Add abort_with_msg() and ASSERT_WITH_MSG() helpers to allow this.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r-- | util.c | 19 | ||||
-rw-r--r-- | util.h | 25 |
2 files changed, 29 insertions, 15 deletions
@@ -1017,3 +1017,22 @@ void encode_domain_name(char *buf, const char *domain_name) } p[i] = 0L; } + +/** + * abort_with_msg() - Print error message and abort + * @fmt: Format string + * @...: Format parameters + */ +void abort_with_msg(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vlogmsg(true, false, LOG_CRIT, fmt, ap); + va_end(ap); + + /* This may actually cause a SIGSYS instead of SIGABRT, due to seccomp, + * but that will still get the job done. + */ + abort(); +} @@ -61,27 +61,22 @@ #define STRINGIFY(x) #x #define STR(x) STRINGIFY(x) -#ifdef CPPCHECK_6936 +void abort_with_msg(const char *fmt, ...) + __attribute__((format(printf, 1, 2), noreturn)); + /* Some cppcheck versions get confused by aborts inside a loop, causing * it to give false positive uninitialised variable warnings later in * the function, because it doesn't realise the non-initialising path * already exited. See https://trac.cppcheck.net/ticket/13227 + * + * Therefore, avoid using the usual do while wrapper we use to force the macro + * to act like a single statement requiring a ';'. */ -#define ASSERT(expr) \ - ((expr) ? (void)0 : abort()) -#else +#define ASSERT_WITH_MSG(expr, ...) \ + ((expr) ? (void)0 : abort_with_msg(__VA_ARGS__)) #define ASSERT(expr) \ - do { \ - if (!(expr)) { \ - err("ASSERTION FAILED in %s (%s:%d): %s", \ - __func__, __FILE__, __LINE__, STRINGIFY(expr)); \ - /* This may actually SIGSYS, due to seccomp, \ - * but that will still get the job done \ - */ \ - abort(); \ - } \ - } while (0) -#endif + ASSERT_WITH_MSG((expr), "ASSSERTION FAILED in %s (%s:%d): %s", \ + __func__, __FILE__, __LINE__, STRINGIFY(expr)) #ifdef P_tmpdir #define TMPDIR P_tmpdir |