[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XEN PATCH v6] xen/include: avoid using a compiler extension for BUILD_BUG_ON_ZERO
On Mon, 26 Jun 2023, Nicola Vetrini wrote: > Redefine BUILD_BUG_ON_ZERO to avoid using a compiler extension > that gives an acceptable semantics to C99 undefined behavior 58 > ("A structure or union is defined as containing no named members > (6.7.2.1)"). > > The first definition includes an additional named field of type > char. > > The chosen ill-formed construct for the second definition is a struct > with a named bitfield of width 0 when the condition is true, > which prevents the UB without using the compiler extension while keeping > the semantic of the construct. > > The choice of the bitwise AND operation to bring the result to 0 > when cond is false boils down to possibly better portability. > > Signed-off-by: Nicola Vetrini <nicola.vetrini@xxxxxxxxxxx> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > Changes in V2: > - Avoid using a VLA as the compile-time assertion > - Do not drop _Static_assert > Changes in V3: > - Changed the operation to bring the result to 0 when the > construct does not lead to a compilation error > Changes in V4: > - Switched to a shorter construct for the second definition. > Changes in V5: > - Dropped 'U's from the macro definitions. > Changes in V6: > - Fixed patch submission. > --- > xen/include/xen/lib.h | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h > index 67fc7c1d7e..a8958ed57b 100644 > --- 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 ")"); }) & 0) > #else > -#define BUILD_BUG_ON_ZERO(cond) sizeof(struct { int:-!!(cond); }) > +#define BUILD_BUG_ON_ZERO(cond) \ > + (sizeof(struct { unsigned u : !(cond); }) & 0) > #define BUILD_BUG_ON(cond) ((void)BUILD_BUG_ON_ZERO(cond)) > #endif > > -- > 2.34.1 >
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |