diff options
author | Thomas Haller <thaller@redhat.com> | 2017-12-07 12:31:55 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-12-15 11:48:38 +0100 |
commit | 974501fdcfa91547539ad1049c0cb3339c08efb3 (patch) | |
tree | a307809a731037fc0788736d2decce7085b29a39 | |
parent | 9c3402aa1e145420b868359e993b0a38ae9a6408 (diff) | |
download | NetworkManager-th/static-asserts.tar.gz |
shared: add static assert for nm_g_slice_free_fcn() argumentth/static-asserts
-rw-r--r-- | libnm-core/tests/test-general.c | 7 | ||||
-rw-r--r-- | shared/nm-utils/nm-shared-utils.h | 10 |
2 files changed, 15 insertions, 2 deletions
diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c index da7ea7b1f8..ba34e6e9e7 100644 --- a/libnm-core/tests/test-general.c +++ b/libnm-core/tests/test-general.c @@ -210,6 +210,10 @@ static void test_nm_g_slice_free_fcn (void) { gpointer p; + struct { + char a1; + char a2; + } xx; p = g_slice_new (gint64); (nm_g_slice_free_fcn (gint64)) (p); @@ -222,6 +226,9 @@ test_nm_g_slice_free_fcn (void) p = g_slice_new (gint64); nm_g_slice_free_fcn_gint64 (p); + + p = g_slice_alloc (sizeof (xx)); + (nm_g_slice_free_fcn (xx)) (p); } /*****************************************************************************/ diff --git a/shared/nm-utils/nm-shared-utils.h b/shared/nm-utils/nm-shared-utils.h index 89ad8b8d48..17024d591f 100644 --- a/shared/nm-utils/nm-shared-utils.h +++ b/shared/nm-utils/nm-shared-utils.h @@ -326,12 +326,18 @@ _nm_g_slice_free_fcn_define (16) /* If mem_size is a compile time constant, the compiler * will be able to optimize this. Hence, you don't want * to call this with a non-constant size argument. */ \ - switch (mem_size) { \ + G_STATIC_ASSERT_EXPR ( ((mem_size) == 1) \ + || ((mem_size) == 2) \ + || ((mem_size) == 4) \ + || ((mem_size) == 8) \ + || ((mem_size) == 12) \ + || ((mem_size) == 16)); \ + switch ((mem_size)) { \ case 1: _fcn = _nm_g_slice_free_fcn_1; break; \ case 2: _fcn = _nm_g_slice_free_fcn_2; break; \ case 4: _fcn = _nm_g_slice_free_fcn_4; break; \ case 8: _fcn = _nm_g_slice_free_fcn_8; break; \ - case 12: _fcn = _nm_g_slice_free_fcn_12; break; \ + case 12: _fcn = _nm_g_slice_free_fcn_12; break; \ case 16: _fcn = _nm_g_slice_free_fcn_16; break; \ default: g_assert_not_reached (); _fcn = NULL; break; \ } \ |