Commit d7a516c6 authored by Philipp Reisner's avatar Philipp Reisner Committed by Kees Cook
Browse files

compiler.h: Fix undefined BUILD_BUG_ON_ZERO()



<linux/compiler.h> defines __must_be_array() and __must_be_cstr() and
both expand to BUILD_BUG_ON_ZERO(), but <linux/build_bug.h> defines
BUILD_BUG_ON_ZERO(). Including <linux/build_bug.h> in
<linux/compiler.h> would create a cyclic dependency as
<linux/build_bug.h> already includes <linux/compiler.h>.

Fix that by defining __BUILD_BUG_ON_ZERO_MSG() in <linux/compiler.h>
and using that for __must_be_array() and __must_be_cstr().

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Link: https://lore.kernel.org/r/20241115204602.249590-1-philipp.reisner@linbit.com


Signed-off-by: default avatarKees Cook <kees@kernel.org>
parent a508ef4b
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -239,11 +239,18 @@ static inline void *offset_to_ptr(const int *off)

#endif /* __ASSEMBLY__ */

#ifdef __CHECKER__
#define __BUILD_BUG_ON_ZERO_MSG(e, msg) (0)
#else /* __CHECKER__ */
#define __BUILD_BUG_ON_ZERO_MSG(e, msg) ((int)sizeof(struct {_Static_assert(!(e), msg);}))
#endif /* __CHECKER__ */

/* &a[0] degrades to a pointer: a different type from an array */
#define __must_be_array(a)	BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
#define __must_be_array(a)	__BUILD_BUG_ON_ZERO_MSG(__same_type((a), &(a)[0]), "must be array")

/* Require C Strings (i.e. NUL-terminated) lack the "nonstring" attribute. */
#define __must_be_cstr(p)	BUILD_BUG_ON_ZERO(__annotated(p, nonstring))
#define __must_be_cstr(p) \
	__BUILD_BUG_ON_ZERO_MSG(__annotated(p, nonstring), "must be cstr (NUL-terminated)")

/*
 * This returns a constant expression while determining if an argument is