cvs commit: src/sys/dev/fxp if_fxpreg.h
Stefan Farfeleder
stefan at fafoe.dyndns.org
Sun Apr 6 00:36:14 PST 2003
On Sun, Apr 06, 2003 at 02:16:07PM +1000, Bruce Evans wrote:
> On Sat, 5 Apr 2003, Maxime Henrion wrote:
>
> > mux 2003/04/05 15:46:58 PST
> >
> > FreeBSD src repository
> >
> > Modified files:
> > sys/dev/fxp if_fxpreg.h
> > Log:
> > ...
> > - Change some u_int to u_int8_t which make more sense here since
> > we're really defining bytes. That produces the same code due to
> > how bitfields work.
>
> This gives undefined behaviour and thus produces random code if it is
> compiled by a C compiler (unless Bool_t happens to be u_int8_t). From
> n869.txt:
>
> [#8] A bit-field shall have a type that is a qualified or
> unqualified version of _Bool, signed int, or unsigned int.
>
> I fixed this bug in many places, including in rev.1.13 of if_fxpreg.h.
> but it keeps getting reintroduced :-(.
>
> Bit-fields of other integer types are an unportable gcc extension.
> They affect the struct layout in unportable apparently-undocumented
> ways. IIRC, they don't affect internal padding but they do affect the
> size and alignment the struct -- a struct that has only uint8_t
> bit-fields in it has only the size and alignment requirements of
> uint8_t, while a struct with only u_int bit-fields in it has the size
> and alignment requirements of u_int. This may be controlled to some
> extent using other unportable gcc extensions.
FYI, the final standard says
4 A bit-field shall have a type that is a qualified or unqualified version of _Bool, signed
int, unsigned int, or some other implementation-defined type.
and moved it from the Semantics to the Constraints section, so a C
compiler not supporting u_int8_t has to issue at least a diagnostic
before producing random code :)
Regards,
Stefan Farfeleder
More information about the cvs-src
mailing list