[New-bugs-announce] [issue41932] Incorrect struct definition with bitfields
berthin
report at bugs.python.org
Sun Oct 4 11:56:03 EDT 2020
New submission from berthin <berthin_37 at hotmail.com>:
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 at 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 at 0bc6a647abaa:/target/cpython-fix# gcc sample.c -o a && ./a
4
Also, 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
end
Hope someone could spot the issue, I will also try to investigate it by my own.
Best,
P.S. For the tests, I worked on top of bpo-29753 (https://github.com/python/cpython/pull/19850)
----------
components: ctypes
files: bitfields.zip
messages: 377953
nosy: FFY00, berthin
priority: normal
severity: normal
status: open
title: Incorrect struct definition with bitfields
type: behavior
versions: Python 3.10, Python 3.8, Python 3.9
Added file: https://bugs.python.org/file49493/bitfields.zip
_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue41932>
_______________________________________
More information about the New-bugs-announce
mailing list