aboutsummaryrefslogtreecommitdiff
path: root/lib/util.h
diff options
context:
space:
mode:
authorFlavio Leitner <fbl@redhat.com>2013-10-02 02:40:09 -0300
committerBen Pfaff <blp@nicira.com>2013-10-02 16:45:38 -0700
commit878f1972909b33f27b32ad2ded208eb465b98a9b (patch)
tree48465db822d9fbfb15dbc1e595fcebc8e9960376 /lib/util.h
parent884f3511e116ada64605afb04513fabec9759166 (diff)
util: use gcc builtins to better check array sizes
GCC provides two useful builtin functions that can help to improve array size checking during compilation. This patch contains no functional changes, but it makes it easier to detect mistakes. Signed-off-by: Flavio Leitner <fbl@redhat.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'lib/util.h')
-rw-r--r--lib/util.h17
1 files changed, 16 insertions, 1 deletions
diff --git a/lib/util.h b/lib/util.h
index 0db41be9..a899065a 100644
--- a/lib/util.h
+++ b/lib/util.h
@@ -87,8 +87,23 @@ void ovs_assert_failure(const char *, const char *, const char *) NO_RETURN;
extern const char *program_name;
+#define __ARRAY_SIZE_NOCHECK(ARRAY) (sizeof(ARRAY) / sizeof((ARRAY)[0]))
+#ifdef __GNUC__
+/* return 0 for array types, 1 otherwise */
+#define __ARRAY_CHECK(ARRAY) \
+ !__builtin_types_compatible_p(typeof(ARRAY), typeof(&ARRAY[0]))
+
+/* compile-time fail if not array */
+#define __ARRAY_FAIL(ARRAY) (sizeof(char[-2*!__ARRAY_CHECK(ARRAY)]))
+#define __ARRAY_SIZE(ARRAY) \
+ __builtin_choose_expr(__ARRAY_CHECK(ARRAY), \
+ __ARRAY_SIZE_NOCHECK(ARRAY), __ARRAY_FAIL(ARRAY))
+#else
+#define __ARRAY_SIZE(ARRAY) __ARRAY_SIZE_NOCHECK(ARRAY)
+#endif
+
/* Returns the number of elements in ARRAY. */
-#define ARRAY_SIZE(ARRAY) (sizeof ARRAY / sizeof *ARRAY)
+#define ARRAY_SIZE(ARRAY) __ARRAY_SIZE(ARRAY)
/* Returns X / Y, rounding up. X must be nonnegative to round correctly. */
#define DIV_ROUND_UP(X, Y) (((X) + ((Y) - 1)) / (Y))