std-aux: drop assertion and function name from assert() in release mode

For g_assert() and g_return*() we already do the same, in
"src/libnm-glib-aux/nm-gassert-patch.h"

Also patch __assert_fail() so that it omits the condition text and the
function name in production builds.

Note that this is a bit ugly, for two reasons:

- again, we make assumptions that __assert_fail() exists. In practice,
  this is the case for glibc and musl.

- <assert.h> can be included multiple times, while also forward
  declaring __assert_fail(). That means, we cannot add a macro

  #define __assert_fail(...)

  because that would break the forward declaration. Instead,
  just `#define __assert_fail _nm_assert_fail_internal`

Of course, this only affects direct calls to assert(), which we have
few. nm_assert() is not affected, because that anyway doesn't do
anything, unless NM_MORE_ASSERTS is enabled.
This commit is contained in:
Thomas Haller 2022-10-20 10:15:10 +02:00
parent 8e3299498d
commit 1ce29e120b
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
2 changed files with 22 additions and 0 deletions

View file

@ -78,6 +78,9 @@ test_gpid(void)
* the case. */
int_ptr = &pid;
g_assert_cmpint(*int_ptr, ==, 42);
/* also check how assert() works. */
assert(*int_ptr == 42);
}
/*****************************************************************************/

View file

@ -194,6 +194,25 @@ typedef uint64_t _nm_bitwise nm_be64_t;
#define NM_MORE_ASSERTS 0
#endif
#if NM_MORE_ASSERTS == 0
/* The string with the assertion check and the function name blows up the
* binary size. In production mode, let's drop those, similar to
* g_assertion_message_expr.
*
* Note that <assert.h> can be included multiple times. We can thus
* not redefine __assert_fail(...). Instead, just redefine the name
* __assert_fail. */
_nm_noreturn static inline void
_nm_assert_fail_internal(const char *assertion,
const char *file,
unsigned int line,
const char *function)
{
__assert_fail("<dropped>", file, line, "<unknown-fcn>");
}
#define __assert_fail _nm_assert_fail_internal
#endif
#define _nm_assert_fail(msg) __assert_fail((msg), __FILE__, __LINE__, __func__)
#ifndef NDEBUG
#define _NM_ASSERT_FAIL_ENABLED 1