New submission from Gregory Szorc <gregory.sz...@gmail.com>:

At least the PyASCIIObject struct in Include/cpython/unicodeobject.h uses bit 
fields. Various preprocessor macros like PyUnicode_IS_ASCII() and 
PyUnicode_KIND() access this struct's bit field.

This is problematic because according to the C specification, the storage of 
bit fields is unspecified and may vary from compiler to compiler or 
architecture to architecture. Theoretically, a build of libpython with compiler 
A may not have the same storage layout of a bit field as a separate binary 
built with compiler B. These 2 binaries could be linked/loaded together, 
resulting in a crash or incorrect behavior at run-time.

https://stackoverflow.com/questions/6043483/why-bit-endianness-is-an-issue-in-bitfields/6044223#6044223

To ensure bit field behavior is consistent, the same compiler must be used for 
all bit field interaction. Since it is effectively impossible to ensure this 
for programs like Python where multiple compilers are commonly at play (a 3rd 
party C extension will likely not be built on the same machine that built 
libpython), bit fields must not be exposed in the C API. If a bit field must 
exist, the bit field should not be declared in a public .h header and any APIs 
for accessing the bit field must be implemented as compiled functions such that 
only a single compiler will define the bit field storage layout.

In order to avoid undefined behavior, Python's C API should avoid all use of 
bit fields.

This issue is in response to https://github.com/PyO3/pyo3/issues/1824.

----------
components: C API
messages: 400388
nosy: indygreg
priority: normal
severity: normal
status: open
title: Reliance on C bit fields is C API is undefined behavior
type: behavior
versions: Python 3.10, Python 3.11, Python 3.6, Python 3.7, Python 3.8, Python 
3.9

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue45025>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to