Wireshark mailing list archives
Re: C Bitfield types and alignment
From: Bill Meier <wmeier () newsguy com>
Date: Mon, 05 Dec 2011 16:41:07 -0500
My curiosity was piqued by Guy's comment in SVN #40078: "Bitfields indicate how many bits they are; "guint8 foo:4" is self-contradictory (it's 4 bits, not 8). Furthermore, the C language doesn't support "unsigned char" as a bitfield type;some compilers might accept that, but if you crank up the warning levels, even GCC will warn about that." So: I decided to do some research. What I found:1. The only valid types for a C bitfield (at least for C89) are [unsigned|signed] int (as implied by Guy).
However, supposedly "many" C compilers allow other types. Given that AFAIK we've not had any complaints about the use ofguint8 & etc as a bitfield type, presumably the compilers commonly used to compile Wireshark accept same.
2. I found the following to be interesting (although somewhat academic since with respect to portability (unsigned|signed) int are probably the only valid bitfield types which should be used).
I did some tests using VC9 (on Windows 32bit) and GCC 4.6.1 (on Fedora 32bit).
For these compilers apparently the type of a bitfield (for whatever the compiler accepts as a bitfield type) determines the bitfield alignment and the size of the struct containing that bitfield.
For example: Given struct radiotap_override { guint8 field; guint align:4, size:4; } aaa; struct radiotap_override { guint8 field; guint8 align:4, size:4; } bbb; It turns out that: sizeof(aaa) = 8 sizeof(bbb) = 2Apparently the alignment of the start of the bitfield depends upon the (largest ?) bitfield type;
Also: Given: struct { guint16 a:12; guint16 b:12 } xxx; struct { guint a:12; guint b:12 } yyy;The size of the two structs is the same, but the alignment of 'b' is different for each;
As I said: Interesting (in a minor way) :) Bill ___________________________________________________________________________ Sent via: Wireshark-dev mailing list <wireshark-dev () wireshark org> Archives: http://www.wireshark.org/lists/wireshark-dev Unsubscribe: https://wireshark.org/mailman/options/wireshark-dev mailto:wireshark-dev-request () wireshark org?subject=unsubscribe
Current thread:
- Re: C Bitfield types and alignment Bill Meier (Dec 05)
- Re: C Bitfield types and alignment Guy Harris (Dec 05)
- Re: C Bitfield types and alignment Jeff Morriss (Dec 05)
- Re: C Bitfield types and alignment Guy Harris (Dec 05)
- Re: C Bitfield types and alignment Guy Harris (Dec 05)
- Re: C Bitfield types and alignment Guy Harris (Dec 05)