Do not allocate non-PyObjects with PyObject_Malloc() · Issue #114569 · python/cpython · GitHub
Skip to content

Do not allocate non-PyObjects with PyObject_Malloc() #114569

Description

@colesbury

Feature or enhancement

The free-threaded build requires that Python objects -- and only Python objects -- be allocated through the Python object allocation APIs (like PyObject_Malloc() or PyType_GenericNew()) 1.

There are a few places internally 2 that use PyObject_Malloc() for non Python objects. We should switch those call sites to use PyMem_Malloc()/Free() instead.

Note that there is not a significant difference between using PyObject_Malloc() and PyMem_Malloc() in the default build. Both calls use obmalloc under the hood, so switching from one to the other should not matter for the default build.

Here are some examples, but this list may not be exhaustive:


self->extra = PyObject_Malloc(sizeof(ElementObjectExtra));

children = PyObject_Realloc(self->extra->children,
size * sizeof(PyObject*));

https://github.com/python/cpython/blob/main/Modules/mathmodule.c#L2573
static XML_Memory_Handling_Suite ExpatMemoryHandler = {
PyObject_Malloc, PyObject_Realloc, PyObject_Free};

new->ob_bytes = PyObject_Malloc(alloc);

Linked PRs

Footnotes

  1. See https://peps.python.org/pep-0703/#backwards-compatibility:~:text=Non%2DPython%20objects%20must%20not%20be%20allocated%20through%20those%20APIs

  2. @DinoV fixed the use in dictobject.c in https://github.com/python/cpython/pull/114543

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions