You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#ifndef MS_WIN32
} else if (bitsize /* this is a bitfield request */
&& *pfield_size /* we have a bitfield open */
&& dict->size * 8 >= *pfield_size
&& (*pbitofs + bitsize) <= dict->size * 8) {
/* expand bit field */
fieldtype = EXPAND_BITFIELD;
#endif
Specifically dict->size * 8 >= *pfield_size
if *bitofs == *pfield_size then the current field is filled, and expanding the bitfield should not be done.
Consideraddingthis*pfield_size!=*bitofs#ifndefMS_WIN32
} elseif (bitsize/* this is a bitfield request */&&*pfield_size/* we have a bitfield open */&&*pfield_size!=*pbitofs/* Current field has been filled, start new one */&&dict->size*8 >= *pfield_size&& (*pbitofs+bitsize) <= dict->size*8) {
/* expand bit field */fieldtype=EXPAND_BITFIELD;
#endif
Activity
thesamprice commentedon Mar 5, 2020
if 8 1 byte fields are included in a ctype field, it allows an extra byte to be included in the packing when there is no room left for the next field.
If I put the bitfields in a child structure then I get expected results.
In [35]: run ctypeSizeTest.py
Size is 4 Expected 3
0 0x10000 a0
0 0x10001 a1
0 0x10002 a2
0 0x10003 a3
0 0x10004 a4
0 0x10005 a5
0 0x10006 a6
0 0x10007 a7
0 0x40008 b0 <- Expected to be at offset 1, not 0.
2 0xc0000 b1 <- Expected to be at offset 1, not 2
Size is 3 Expected 3
0 0x1 a
1 0x40000 b0
1 0xc0004 b1
thesamprice commentedon Mar 5, 2020
Does not happen on windows.
Error is in cfield.c
Specifically dict->size * 8 >= *pfield_size
if *bitofs == *pfield_size then the current field is filled, and expanding the bitfield should not be done.
encukou commentedon Sep 10, 2024
Fixed in #97702, the reproducer is now part of tests (as the
Example_gh_84039*classes)