all: merge branch 'th/unreachable-asserts'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1470
This commit is contained in:
@@ -530,7 +530,12 @@ nm_str_realloc(char *str)
|
|||||||
/* redefine assertions to use g_assert*() */
|
/* redefine assertions to use g_assert*() */
|
||||||
#undef _nm_assert_fail
|
#undef _nm_assert_fail
|
||||||
#define _nm_assert_fail(msg) \
|
#define _nm_assert_fail(msg) \
|
||||||
g_assertion_message_expr(G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg)
|
G_STMT_START \
|
||||||
|
{ \
|
||||||
|
g_assertion_message_expr(G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); \
|
||||||
|
_nm_unreachable_code(); \
|
||||||
|
} \
|
||||||
|
G_STMT_END
|
||||||
|
|
||||||
#undef _NM_ASSERT_FAIL_ENABLED
|
#undef _NM_ASSERT_FAIL_ENABLED
|
||||||
#ifndef G_DISABLE_ASSERT
|
#ifndef G_DISABLE_ASSERT
|
||||||
|
@@ -75,6 +75,14 @@
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/* This is mainly used in case of failed assertions. Usually assert() itself
|
||||||
|
* already ensures that the code path is marked as unreachable, however with
|
||||||
|
* NDEBUG that might not be the case. We want to mark the code as unreachable
|
||||||
|
* even with NDEBUG/G_DISABLE_ASSERT. */
|
||||||
|
#define _nm_unreachable_code() __builtin_unreachable()
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
#ifndef _NM_CC_SUPPORT_AUTO_TYPE
|
#ifndef _NM_CC_SUPPORT_AUTO_TYPE
|
||||||
#if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)))
|
#if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)))
|
||||||
#define _NM_CC_SUPPORT_AUTO_TYPE 1
|
#define _NM_CC_SUPPORT_AUTO_TYPE 1
|
||||||
@@ -175,7 +183,15 @@ typedef uint64_t _nm_bitwise nm_be64_t;
|
|||||||
NM_UNIQ_T(V, v) = 0; \
|
NM_UNIQ_T(V, v) = 0; \
|
||||||
NM_UNIQ_T(V, v); \
|
NM_UNIQ_T(V, v); \
|
||||||
})
|
})
|
||||||
#define NM_BOOLEAN_EXPR(expr) _NM_BOOLEAN_EXPR_IMPL(NM_UNIQ, expr)
|
|
||||||
|
#if defined(__GNUC__) && (__GNUC__ > 4)
|
||||||
|
#define NM_BOOLEAN_EXPR(expr) \
|
||||||
|
__builtin_choose_expr(__builtin_constant_p(expr), \
|
||||||
|
(!!(expr)), \
|
||||||
|
_NM_BOOLEAN_EXPR_IMPL(NM_UNIQ, expr))
|
||||||
|
#else
|
||||||
|
#define NM_BOOLEAN_EXPR(expr) (!!(expr))
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
|
#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
|
||||||
#define NM_LIKELY(expr) __builtin_expect(NM_BOOLEAN_EXPR(expr), 1)
|
#define NM_LIKELY(expr) __builtin_expect(NM_BOOLEAN_EXPR(expr), 1)
|
||||||
@@ -226,10 +242,12 @@ _nm_assert_fail_internal(const char *assertion,
|
|||||||
#define _NM_ASSERT_FAIL_ENABLED 1
|
#define _NM_ASSERT_FAIL_ENABLED 1
|
||||||
#define _nm_assert_fail(msg) __assert_fail((msg), __FILE__, __LINE__, __func__)
|
#define _nm_assert_fail(msg) __assert_fail((msg), __FILE__, __LINE__, __func__)
|
||||||
#else
|
#else
|
||||||
#define _NM_ASSERT_FAIL_ENABLED 1
|
#define _NM_ASSERT_FAIL_ENABLED 0
|
||||||
#define _nm_assert_fail(msg) \
|
#define _nm_assert_fail(msg) \
|
||||||
do { \
|
do { \
|
||||||
_nm_unused const char *_msg = (msg); \
|
_nm_unused const char *_msg = (msg); \
|
||||||
|
\
|
||||||
|
_nm_unreachable_code(); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -243,6 +261,11 @@ _nm_assert_fail_internal(const char *assertion,
|
|||||||
* As such, nm_assert() is async-signal-safe (provided @cond is, and
|
* As such, nm_assert() is async-signal-safe (provided @cond is, and
|
||||||
* the assertion does not fail). */ \
|
* the assertion does not fail). */ \
|
||||||
if (NM_MORE_ASSERTS_EFFECTIVE == 0) { \
|
if (NM_MORE_ASSERTS_EFFECTIVE == 0) { \
|
||||||
|
if (__builtin_constant_p(cond) && !(cond)) { \
|
||||||
|
/* Constant expressions are still evaluated and result
|
||||||
|
* in unreachable code. This handles nm_assert(FALSE). */ \
|
||||||
|
_nm_unreachable_code(); \
|
||||||
|
} \
|
||||||
/* pass */ \
|
/* pass */ \
|
||||||
} else if (NM_LIKELY(cond)) { \
|
} else if (NM_LIKELY(cond)) { \
|
||||||
/* pass */ \
|
/* pass */ \
|
||||||
@@ -261,11 +284,12 @@ _nm_assert_fail_internal(const char *assertion,
|
|||||||
* the assertion does not fail). */ \
|
* the assertion does not fail). */ \
|
||||||
if (NM_LIKELY(cond)) { \
|
if (NM_LIKELY(cond)) { \
|
||||||
/* pass */ \
|
/* pass */ \
|
||||||
} else if (NM_MORE_ASSERTS_EFFECTIVE == 0) { \
|
|
||||||
/* pass */ \
|
|
||||||
} else { \
|
} else { \
|
||||||
|
if (NM_MORE_ASSERTS_EFFECTIVE != 0) { \
|
||||||
_nm_assert_fail(#cond); \
|
_nm_assert_fail(#cond); \
|
||||||
} \
|
} \
|
||||||
|
_nm_unreachable_code(); \
|
||||||
|
} \
|
||||||
1; \
|
1; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user