cvs commit: src/sys/dev/fxp if_fxpreg.h

Bruce Evans bde at zeta.org.au
Sat Apr 5 20:16:13 PST 2003


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.

Bruce


More information about the cvs-src mailing list