gh-121617: Include <string.h> for Py_CLEAR() macro (#144666)

Python.h now also includes <string.h> in the limited C API version 3.11
and newer to fix the Py_CLEAR() macro which uses memcpy().

Add a Py_CLEAR() test in test_cext.

Modify also _Py_TYPEOF to use C23 typeof() if available.
This commit is contained in:
Victor Stinner 2026-02-12 17:03:55 +01:00 committed by GitHub
parent eb6ebdbc95
commit 9e5e1f9988
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 16 additions and 6 deletions

View file

@ -123,6 +123,7 @@ System includes
* ``<limits.h>``
* ``<math.h>``
* ``<stdarg.h>``
* ``<string.h>``
* ``<wchar.h>``
* ``<sys/types.h>`` (if present)
@ -138,7 +139,6 @@ System includes
* ``<errno.h>``
* ``<stdio.h>``
* ``<stdlib.h>``
* ``<string.h>``
.. note::

View file

@ -22,12 +22,13 @@
#include <limits.h> // INT_MAX
#include <math.h> // HUGE_VAL
#include <stdarg.h> // va_list
#include <string.h> // memcpy()
#include <wchar.h> // wchar_t
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h> // ssize_t
#endif
// <errno.h>, <stdio.h>, <stdlib.h> and <string.h> headers are no longer used
// <errno.h>, <stdio.h> and <stdlib.h> headers are no longer used
// by Python, but kept for the backward compatibility of existing third party C
// extensions. They are not included by limited C API version 3.11 and newer.
//
@ -37,7 +38,6 @@
# include <errno.h> // errno
# include <stdio.h> // FILE*
# include <stdlib.h> // getenv()
# include <string.h> // memcpy()
#endif
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030d0000
# include <ctype.h> // tolower()

View file

@ -567,8 +567,11 @@ extern "C" {
//
// Example: _Py_TYPEOF(x) x_copy = (x);
//
// The macro is only defined if GCC or clang compiler is used.
#if defined(__GNUC__) || defined(__clang__)
// On C23, use typeof(). Otherwise, the macro is only defined
// if GCC or clang compiler is used.
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 202311L
# define _Py_TYPEOF(expr) typeof(expr)
#elif defined(__GNUC__) || defined(__clang__)
# define _Py_TYPEOF(expr) __typeof__(expr)
#endif

View file

@ -76,7 +76,7 @@ static PyMethodDef _testcext_methods[] = {
static int
_testcext_exec(PyObject *module)
{
PyObject *result;
PyObject *result, *obj;
#ifdef __STDC_VERSION__
if (PyModule_AddIntMacro(module, __STDC_VERSION__) < 0) {
@ -92,6 +92,10 @@ _testcext_exec(PyObject *module)
Py_BUILD_ASSERT(sizeof(int) == sizeof(unsigned int));
assert(Py_BUILD_ASSERT_EXPR(sizeof(int) == sizeof(unsigned int)) == 0);
// Test Py_CLEAR()
obj = NULL;
Py_CLEAR(obj);
return 0;
}

View file

@ -0,0 +1,3 @@
``Python.h`` now also includes ``<string.h>`` in the limited C API version 3.11
and newer to fix the :c:macro:`Py_CLEAR` macro which uses ``memcpy()``. Patch
by Victor Stinner.