Repository navigation
Incorrect struct definition with bitfields #86098
Description
Activity
Hi all,
I found one issue related to bitfields and ctypes, and although there is a similar issue already opened (https://bugs.python.org/issue29753), that only covers the case with pragmas.
Please, consider the following scenario:
>>> from ctypes import * >>> class X(Structure): ... _fields_ = [("a", c_uint8, 8), ("b", c_uint8, 8), ("c", c_uint32, 16)] ... >>> sizeof(X) 5
Which seems to be incorrect, because what natively C does is to generate a 4bytes struct.
root@0bc6a647abaa:/target/cpython-fix# cat sample.c
#include <stdio.h> #include <stdint.h> struct X { uint8_t a; uint8_t b; uint32_t c:16; } X; int main() { printf("%u\n", sizeof(X)); }
root@0bc6a647abaa:/target/cpython-fix# gcc sample.c -o a && ./a
4Also, if I use different databtypes I get what I expect (a struct of 4 bytes).
>>> X = type('X', (Structure,), {'_fields_': [('a', c_uint32, 8), ('b', c_uint32, 8), ('c', c_uint32, 16)]}) >>> sizeof(X) 4 >>> X = type('X', (Structure,), {'_fields_': [('a', c_uint16, 8), ('b', c_uint16, 8), ('c', c_uint16, 16)]}) >>> sizeof(X) 4 >>> X = type('X', (Structure,), {'_fields_': [('a', c_uint8, 8), ('b', c_uint8, 8), ('c', c_uint16, 16)]}) >>> sizeof(X) 4
I tried to debug a little bit, adding some prints before and after calling *PyCField_FromDesc* in *Modules/_ctypes/stgdict.c:L603*.=, if someone wants to look at it, the logs are attached / one log file per each test, using the following gdb init:
# before
break stgdict.c:601
commands
p field_size
p bitofs
p size
p align
p *dict
continue
end# after
break stgdict.c:617
commands
p field_size
p bitofs
p size
p align
p *(CFieldObject*) prop
continue
endHope someone could spot the issue, I will also try to investigate it by my own.
Best,
- added3.8 (EOL)end of lifeend of life3.9 (EOL)end of lifeend of life3.10 (EOL)end of lifeend of lifetype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Oct 4, 2020 Fixed in #97702, the reproducer is now part of tests (as the
Example_gh_86098*classes)
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsDone
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields: