[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [XEN PATCH v2] xen/include: avoid undefined behavior.
- To: Jan Beulich <jbeulich@xxxxxxxx>
- From: Nicola Vetrini <nicola.vetrini@xxxxxxxxxxx>
- Date: Thu, 22 Jun 2023 10:15:20 +0200
- Cc: sstabellini@xxxxxxxxxx, michal.orzel@xxxxxxx, xenia.ragiadakou@xxxxxxx, ayan.kumar.halder@xxxxxxx, consulting@xxxxxxxxxxx, andrew.cooper3@xxxxxxxxxx, roger.pau@xxxxxxxxxx, bertrand.marquis@xxxxxxx, julien@xxxxxxx, George Dunlap <george.dunlap@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx
- Delivery-date: Thu, 22 Jun 2023 08:15:36 +0000
- List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
On 21/06/23 10:48, Jan Beulich wrote:
On 21.06.2023 09:58, Nicola Vetrini wrote:
Redefine BUILD_BUG_ON_ZERO to fully comply with C99 avoiding
undefined behavior 58 ("A structure or union is defined as
containing no named members (6.7.2.1)."
Here and in the title I'm not happy about you referencing undefined
behavior. What we do here is use a well-known compiler extension (and I'm
sure you're aware we do so elsewhere, where it's actually going to remain
as is from all I can tell right now).
Noted, I'll change the commit message.
--- a/xen/include/xen/lib.h
+++ b/xen/include/xen/lib.h
@@ -51,9 +51,10 @@
e.g. in a structure initializer (or where-ever else comma expressions
aren't permitted). */
#define BUILD_BUG_ON_ZERO(cond) \
- sizeof(struct { _Static_assert(!(cond), "!(" #cond ")"); })
+ (sizeof(struct { char c; _Static_assert(!(cond), "!(" #cond ")"); }) - 1U)
To be compatible with whatever odd ABIs new ports may have, maybe better to
AND or multiply with 0? (I also don't think a U suffix is warranted here.)
Good idea
#else
-#define BUILD_BUG_ON_ZERO(cond) sizeof(struct { int:-!!(cond); })
+#define BUILD_BUG_ON_ZERO(cond) \
+ (sizeof(struct { unsigned u : (cond) ? -1 : sizeof(unsigned) * 8; }) -
sizeof(unsigned))
What's wrong with just giving the bitfield a name:
#define BUILD_BUG_ON_ZERO(cond) sizeof(struct { int _:-!!(cond); })
A named bitfield with zero width is not allowed by the standard, which
is why the fix introduces a constant positive width. I'll send a v3
shortly addressing your previous remarks, though.
--
Nicola Vetrini, BSc
Software Engineer, BUGSENG srl (https://bugseng.com)
|