build: remove assertion messages in non-debug build

Assertions like g_assert*() and g_return_*() contain the stringified
test expression. This string ends up in the binary and increases its
size.

We usually don't have failing assertions. These string are a waste,
instead the file and line number shall suffice.

It reduces the striped size of the NetworkManager binary from 2500k
to 2392k, that is -108k, -4.3%.

This changes

 - "g_assert (1 == 2);"
   from: NetworkManager:ERROR:source.c:347:some_function: assertion failed: (1 == 2)
   to:   NetworkManager:ERROR:source.c:347:<unknown-fcn>: assertion failed: (<dropped>)

 - "g_return_if_fail (1 == 2);"
   from: (process:21024): NetworkManager-CRITICAL **: some_function: assertion '1 == 2' failed
   to:   (process:21024): NetworkManager-CRITICAL **: ((source.c:347)): assertion '<dropped>' failed

When doing a non-debug build, those string are now removed. Debug-builds
can be enabled by setting --with-more-assert=$LEVEL to larger then zero.

https://bugzilla.gnome.org/show_bug.cgi?id=767296
This commit is contained in:
Thomas Haller 2016-06-06 15:20:05 +02:00
parent fa973afa19
commit 00f58adb16
2 changed files with 50 additions and 1 deletions

View file

@ -53,6 +53,50 @@
#define NM_VERSION_MIN_REQUIRED NM_VERSION_0_9_8
#include <stdlib.h>
#include <glib.h>
/*****************************************************************************/
#ifndef NM_MORE_ASSERTS
#define NM_MORE_ASSERTS 0
#endif
#if NM_MORE_ASSERTS == 0
/* glib assertions (g_return_*(), g_assert*()) contain a textual representation
* of the checked statement. This part of the assertion blows up the size of the
* binary. Unless we compile a debug-build with NM_MORE_ASSERTS, drop these
* parts. Note that the failed assertion still prints the file and line where the
* assertion fails. That shall suffice. */
static inline void
_nm_g_return_if_fail_warning (const char *log_domain,
const char *file,
int line)
{
char file_buf[256 + 15];
g_snprintf (file_buf, sizeof (file_buf), "((%s:%d))", file, line);
g_return_if_fail_warning (log_domain, file_buf, "<dropped>");
}
#define g_return_if_fail_warning(log_domain, pretty_function, expression) \
_nm_g_return_if_fail_warning (log_domain, __FILE__, __LINE__)
#define g_assertion_message_expr(domain, file, line, func, expr) \
g_assertion_message_expr(domain, file, line, "<unknown-fcn>", (expr) ? "<dropped>" : NULL)
#define NM_ASSERT_G_RETURN_EXPR(expr) "<dropped>"
#define NM_ASSERT_NO_MSG 1
#else
#define NM_ASSERT_G_RETURN_EXPR(expr) ""expr""
#define NM_ASSERT_NO_MSG 0
#endif
/*****************************************************************************/
#include "nm-glib.h"
#include "nm-version.h"

View file

@ -92,6 +92,11 @@
#include "nm-default.h"
#if NM_ASSERT_NO_MSG
#undef g_return_if_fail_warning
#undef g_assertion_message_expr
#endif
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
@ -103,7 +108,7 @@
/*******************************************************************************/
#define NMTST_G_RETURN_MSG_S(expr) "*: assertion '"expr"' failed"
#define NMTST_G_RETURN_MSG_S(expr) "*: assertion '"NM_ASSERT_G_RETURN_EXPR(expr)"' failed"
#define NMTST_G_RETURN_MSG(expr) NMTST_G_RETURN_MSG_S(#expr)
/*******************************************************************************/