-
-
Notifications
You must be signed in to change notification settings - Fork 33.6k
Description
Bug report
Summary
A change between 3.14a7 and 3.14b1 appears to have altered the value of __basicsize__ for ctypes.byref().
This breaks code that relies on this size for low-level struct manipulation.
This issue was discovered while testing comtypes on Python 3.14 after merging a fix that made comtypes.util functional again on Python 3.13 and earlier.
It's unclear whether this is a regression or an intentional change.
The following issues might be related.
- ctypes.Structure: bitfield of underaligned type can cause read of unrelated memory #130410
- Silent ctypes.struct layout change from native to Windows when bitfields are used #131747
I think the problem seems to lie deep within the ctypes implementation.
Reproducer
On Windows, running the comtypes test py -m unittest comtypes.test.test_util will lead to a RuntimeError.
The code snippet from comtypes/util.py (lines 42-45) is shown below:
# additional checks to make sure that everything works as expected
if sizeof(PyCArgObject) != type(byref(c_int())).__basicsize__:
raise RuntimeError("sizeof(PyCArgObject) invalid")We can find 5e241d8 on comtypes that demonstrates the issue.
Expected behavior
The script should run without raising a RuntimeError.
Actual behavior
On Python 3.14.0b1 (and later), the script fails with a RuntimeError.
The values observed for sizeof(PyCArgObject) and type(byref(c_int())).__basicsize__ are as follows:
| Python Version | Arch | sizeof(PyCArgObject) |
type(byref(c_int())).__basicsize__ |
|---|---|---|---|
| Python 3.14a7 (and earlier) | 64-bit | 56 | 56 |
| 32-bit | 32 | 32 | |
| Python 3.14b1 (and later) | 64-bit | 56 | 64 |
| 32-bit | 32 | 40 |
CPython versions tested on:
3.14
Operating systems tested on:
Windows