X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Fbabeltrace%2Fassert-internal.h;h=f8fd0b922cf21a57d1f32be9c202deadd54e1dae;hb=63976d98f349c661f825bdcdd5a2f61d14280a03;hp=c8a9f8377b469b48131cbe41e875d982dd101724;hpb=d244c559056c44c46916e4799b1c6fa6311484fa;p=babeltrace.git diff --git a/include/babeltrace/assert-internal.h b/include/babeltrace/assert-internal.h index c8a9f837..f8fd0b92 100644 --- a/include/babeltrace/assert-internal.h +++ b/include/babeltrace/assert-internal.h @@ -25,22 +25,43 @@ */ #include +#include #ifdef BT_DEBUG_MODE + +extern void bt_common_assert_failed(const char *file, int line, + const char *func, const char *assertion) __attribute__((noreturn)); + /* * Internal assertion (to detect logic errors on which the library user * has no influence). Use BT_ASSERT_PRE() to check a precondition which * must be directly or indirectly satisfied by the library user. */ -# define BT_ASSERT(_cond) do { assert(_cond); } while (0) +#define BT_ASSERT(_cond) \ + do { \ + if (!(_cond)) { \ + bt_common_assert_failed(__FILE__, __LINE__, __func__, \ + TOSTRING(_cond)); \ + } \ + } while (0) /* * Marks a function as being only used within a BT_ASSERT() context. */ # define BT_ASSERT_FUNC #else -# define BT_ASSERT(_cond) -# define BT_ASSERT_FUNC __attribute__((unused)) +/* + * When BT_DEBUG_MODE is not defined, define BT_ASSERT() macro to the following + * to trick the compiler into thinking that the variable passed as condition to + * the assertion is used. This is to prevent set-but-not-used warnings from the + * compiler when assertions are disabled. The `sizeof` operator also makes sure + * that the `_cond` expression is not evaluated, thus preventing unwanted side + * effects. + * + * In-depth explanation: https://stackoverflow.com/questions/37411809/how-to-elegantly-fix-this-unused-variable-warning/37412551#37412551 + */ +# define BT_ASSERT(_cond) ((void) sizeof((void) (_cond), 0)) +# define BT_ASSERT_FUNC BT_UNUSED #endif /* BT_DEBUG_MODE */ #endif /* BABELTRACE_ASSERT_INTERNAL_H */