summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2021-10-13 17:25:53 (GMT)
committerGitHub <noreply@github.com>2021-10-13 17:25:53 (GMT)
commitaac29af6785712019d34f1a7f15b3c408a4f68ae (patch)
treeca44f1d999551118d5ab06e5994b6291d387e3e1
parentdb2b6a20cd35781b2f5e798e880e57e6cf9b97aa (diff)
downloadcpython-aac29af6785712019d34f1a7f15b3c408a4f68ae.zip
cpython-aac29af6785712019d34f1a7f15b3c408a4f68ae.tar.gz
cpython-aac29af6785712019d34f1a7f15b3c408a4f68ae.tar.bz2
bpo-45434: pyport.h no longer includes <stdlib.h> (GH-28914)
Include <stdlib.h> explicitly in C files. Python.h includes <wchar.h>.
-rw-r--r--Doc/whatsnew/3.11.rst3
-rw-r--r--Include/Python.h3
-rw-r--r--Include/internal/pycore_fileutils.h3
-rw-r--r--Include/pyport.h2
-rw-r--r--Misc/NEWS.d/next/C API/2021-10-11-23-03-49.bpo-45434.tsS8I_.rst7
-rw-r--r--Modules/_ctypes/_ctypes_test.c2
-rw-r--r--Modules/_gdbmmodule.c7
-rw-r--r--Modules/_lzmamodule.c1
-rw-r--r--Modules/_pickle.c2
-rw-r--r--Modules/_tracemalloc.c3
-rw-r--r--Modules/faulthandler.c7
-rw-r--r--Modules/getpath.c3
-rw-r--r--Modules/nismodule.c1
-rw-r--r--Modules/ossaudiodev.c1
-rw-r--r--Modules/posixmodule.c3
-rw-r--r--Modules/readline.c6
-rw-r--r--Objects/floatobject.c1
-rw-r--r--Objects/longobject.c3
-rw-r--r--Objects/obmalloc.c1
-rw-r--r--PC/WinMain.c1
-rw-r--r--Programs/_freeze_module.c1
-rw-r--r--Programs/_testembed.c1
-rw-r--r--Python/dtoa.c1
-rw-r--r--Python/errors.c7
-rw-r--r--Python/fileutils.c1
-rw-r--r--Python/initconfig.c2
-rw-r--r--Python/preconfig.c2
-rw-r--r--Python/pylifecycle.c1
-rw-r--r--Python/pystrhex.c4
29 files changed, 60 insertions, 20 deletions
diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst
index 21a0e1a..d18711d 100644
--- a/Doc/whatsnew/3.11.rst
+++ b/Doc/whatsnew/3.11.rst
@@ -556,6 +556,9 @@ Porting to Python 3.11
* The ``<Python.h>`` header file no longer includes ``<stdlib.h>``. C
extensions using ``<stdlib.h>`` must now include it explicitly.
+ The system ``<stdlib.h>`` header provides functions like:
+ ``malloc()``/``free()``, ``getenv()``, ``strtol()``, ``abs()``, ``strtol()``,
+ ``exit()`` and ``abort()``.
(Contributed by Victor Stinner in :issue:`45434`.)
Deprecated
diff --git a/Include/Python.h b/Include/Python.h
index 8c84c90..4f62103 100644
--- a/Include/Python.h
+++ b/Include/Python.h
@@ -33,7 +33,8 @@
# include <stddef.h>
#endif
-#include <assert.h>
+#include <assert.h> // assert()
+#include <wchar.h> // wchar_t
#include "pyport.h"
#include "pymacro.h"
diff --git a/Include/internal/pycore_fileutils.h b/Include/internal/pycore_fileutils.h
index 2316a97..3464477 100644
--- a/Include/internal/pycore_fileutils.h
+++ b/Include/internal/pycore_fileutils.h
@@ -88,6 +88,9 @@ extern int _Py_add_relfile(wchar_t *dirname,
// ...
// _Py_END_SUPPRESS_IPH
#if defined _MSC_VER && _MSC_VER >= 1900
+
+# include <stdlib.h> // _set_thread_local_invalid_parameter_handler()
+
extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler;
# define _Py_BEGIN_SUPPRESS_IPH \
{ _invalid_parameter_handler _Py_old_handler = \
diff --git a/Include/pyport.h b/Include/pyport.h
index 6e4e980..0bec2a9 100644
--- a/Include/pyport.h
+++ b/Include/pyport.h
@@ -205,8 +205,6 @@ typedef Py_ssize_t Py_ssize_clean_t;
* see https://bugs.python.org/issue28126 */
#define Py_MEMCPY memcpy
-#include <stdlib.h>
-
#ifdef HAVE_IEEEFP_H
#include <ieeefp.h> /* needed for 'finite' declaration on some platforms */
#endif
diff --git a/Misc/NEWS.d/next/C API/2021-10-11-23-03-49.bpo-45434.tsS8I_.rst b/Misc/NEWS.d/next/C API/2021-10-11-23-03-49.bpo-45434.tsS8I_.rst
index c04dda5..95c5f0d 100644
--- a/Misc/NEWS.d/next/C API/2021-10-11-23-03-49.bpo-45434.tsS8I_.rst
+++ b/Misc/NEWS.d/next/C API/2021-10-11-23-03-49.bpo-45434.tsS8I_.rst
@@ -1,3 +1,6 @@
The ``<Python.h>`` header file no longer includes ``<stdlib.h>``. C
-extensions using ``<stdlib.h>`` must now include it explicitly. Patch by
-Victor Stinner.
+extensions using ``<stdlib.h>`` must now include it explicitly.
+The system ``<stdlib.h>`` header provides functions like:
+``malloc()``/``free()``, ``getenv()``, ``strtol()``, ``abs()``, ``strtol()``,
+``exit()`` and ``abort()``.
+Patch by Victor Stinner.
diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c
index a33d15d..770c96c 100644
--- a/Modules/_ctypes/_ctypes_test.c
+++ b/Modules/_ctypes/_ctypes_test.c
@@ -4,6 +4,8 @@
#include <windows.h>
#endif
+#include <stdlib.h> // qsort()
+
#define EXPORT(x) Py_EXPORTED_SYMBOL x
/* some functions handy for testing */
diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c
index efbf331..445500c 100644
--- a/Modules/_gdbmmodule.c
+++ b/Modules/_gdbmmodule.c
@@ -5,11 +5,12 @@
#define PY_SSIZE_T_CLEAN
#include "Python.h"
+#include "gdbm.h"
-#include <sys/types.h>
-#include <sys/stat.h>
#include <fcntl.h>
-#include "gdbm.h"
+#include <stdlib.h> // free()
+#include <sys/stat.h>
+#include <sys/types.h>
#if defined(WIN32) && !defined(__CYGWIN__)
#include "gdbmerrno.h"
diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c
index a7156ec..e50f55b 100644
--- a/Modules/_lzmamodule.c
+++ b/Modules/_lzmamodule.c
@@ -10,6 +10,7 @@
#include "Python.h"
#include "structmember.h" // PyMemberDef
+#include <stdlib.h> // free()
#include <string.h>
#include <lzma.h>
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
index e693b50..b513169 100644
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -12,6 +12,8 @@
#include "pycore_moduleobject.h" // _PyModule_GetState()
#include "structmember.h" // PyMemberDef
+#include <stdlib.h> // strtol()
+
PyDoc_STRVAR(pickle_module_doc,
"Optimized C implementation for the Python pickle module.");
diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c
index 9ba0ebb..09d273a 100644
--- a/Modules/_tracemalloc.c
+++ b/Modules/_tracemalloc.c
@@ -5,7 +5,10 @@
#include "pycore_hashtable.h"
#include <pycore_frame.h>
+#include <stdlib.h> // malloc()
+
#include "clinic/_tracemalloc.c.h"
+
/*[clinic input]
module _tracemalloc
[clinic start generated code]*/
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
index 868b4f4..cb2e258 100644
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -3,10 +3,13 @@
#include "pycore_pyerrors.h" // _Py_DumpExtensionModules
#include "pycore_pystate.h" // _PyThreadState_GET()
#include "pycore_traceback.h" // _Py_DumpTracebackThreads
-#include <signal.h>
+
+#include "frameobject.h"
+
#include <object.h>
-#include <frameobject.h>
#include <signal.h>
+#include <signal.h>
+#include <stdlib.h> // abort()
#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK)
# include <pthread.h>
#endif
diff --git a/Modules/getpath.c b/Modules/getpath.c
index 22e5ef2..1405023 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -6,8 +6,9 @@
#include "pycore_pathconfig.h"
#include "osdefs.h" // DELIM
-#include <sys/types.h>
+#include <stdlib.h> // getenv()
#include <string.h>
+#include <sys/types.h>
#ifdef __APPLE__
# include <mach-o/dyld.h>
diff --git a/Modules/nismodule.c b/Modules/nismodule.c
index 6655451..cdda1a6 100644
--- a/Modules/nismodule.c
+++ b/Modules/nismodule.c
@@ -12,6 +12,7 @@
#include "Python.h"
+#include <stdlib.h> // free()
#include <sys/time.h>
#include <sys/types.h>
#include <rpc/rpc.h>
diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c
index 4f2d9cb..4bab9a5 100644
--- a/Modules/ossaudiodev.c
+++ b/Modules/ossaudiodev.c
@@ -21,6 +21,7 @@
#include "Python.h"
#include "structmember.h" // PyMemberDef
+#include <stdlib.h> // getenv()
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#else
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 9c174ee..667a333 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -46,7 +46,8 @@
# undef HAVE_FACCESSAT
#endif
-#include <stdio.h> /* needed for ctermid() */
+#include <stdio.h> // ctermid()
+#include <stdlib.h> // system()
/*
* A number of APIs are available on macOS from a certain macOS version.
diff --git a/Modules/readline.c b/Modules/readline.c
index c79d22f..1b616fc 100644
--- a/Modules/readline.c
+++ b/Modules/readline.c
@@ -6,9 +6,11 @@
/* Standard definitions */
#include "Python.h"
-#include <stddef.h>
-#include <signal.h>
+
#include <errno.h>
+#include <signal.h>
+#include <stddef.h>
+#include <stdlib.h> // free()
#include <sys/time.h>
#if defined(HAVE_SETLOCALE)
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index d25d97f..5a8113e 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -13,6 +13,7 @@
#include <ctype.h>
#include <float.h>
+#include <stdlib.h> // strtol()
/*[clinic input]
class float "PyObject *" "&PyFloat_Type"
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 33fea64..111ef45 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -10,9 +10,10 @@
#include "pycore_pystate.h" // _Py_IsMainInterpreter()
#include "longintrepr.h"
-#include <float.h>
#include <ctype.h>
+#include <float.h>
#include <stddef.h>
+#include <stdlib.h> // abs()
#include "clinic/longobject.c.h"
/*[clinic input]
diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c
index 2d6fedd..d8d6f6d 100644
--- a/Objects/obmalloc.c
+++ b/Objects/obmalloc.c
@@ -2,6 +2,7 @@
#include "pycore_pymem.h" // _PyTraceMalloc_Config
#include <stdbool.h>
+#include <stdlib.h> // malloc()
/* Defined in tracemalloc.c */
diff --git a/PC/WinMain.c b/PC/WinMain.c
index e439bed..07e21ce 100644
--- a/PC/WinMain.c
+++ b/PC/WinMain.c
@@ -4,6 +4,7 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
+#include <stdlib.h> /* __argc, __wargv */
int WINAPI wWinMain(
HINSTANCE hInstance, /* handle to current instance */
diff --git a/Programs/_freeze_module.c b/Programs/_freeze_module.c
index dd90d92..316c70d 100644
--- a/Programs/_freeze_module.c
+++ b/Programs/_freeze_module.c
@@ -12,6 +12,7 @@
#include <pycore_import.h>
#include <stdio.h>
+#include <stdlib.h> // malloc()
#include <sys/types.h>
#include <sys/stat.h>
#ifndef MS_WINDOWS
diff --git a/Programs/_testembed.c b/Programs/_testembed.c
index fa418e2..b61fe34 100644
--- a/Programs/_testembed.c
+++ b/Programs/_testembed.c
@@ -11,6 +11,7 @@
#include <Python.h>
#include <inttypes.h>
#include <stdio.h>
+#include <stdlib.h> // putenv()
#include <wchar.h>
/*********************************************************
diff --git a/Python/dtoa.c b/Python/dtoa.c
index e629b29..6c44f68 100644
--- a/Python/dtoa.c
+++ b/Python/dtoa.c
@@ -119,6 +119,7 @@
#include "Python.h"
#include "pycore_dtoa.h"
+#include <stdlib.h> // exit()
/* if PY_NO_SHORT_FLOAT_REPR is defined, then don't even try to compile
the following code */
diff --git a/Python/errors.c b/Python/errors.c
index f072c21..519f2d4 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -15,12 +15,13 @@ extern char *strerror(int);
#endif
#endif
+#include <ctype.h>
#ifdef MS_WINDOWS
-#include <windows.h>
-#include <winbase.h>
+# include <windows.h>
+# include <winbase.h>
+# include <stdlib.h> // _sys_nerr
#endif
-#include <ctype.h>
#ifdef __cplusplus
extern "C" {
diff --git a/Python/fileutils.c b/Python/fileutils.c
index a364159..173d34d 100644
--- a/Python/fileutils.c
+++ b/Python/fileutils.c
@@ -3,6 +3,7 @@
#include "pycore_runtime.h" // _PyRuntime
#include "osdefs.h" // SEP
#include <locale.h>
+#include <stdlib.h> // mbstowcs()
#ifdef MS_WINDOWS
# include <malloc.h>
diff --git a/Python/initconfig.c b/Python/initconfig.c
index ba6d19d..b0d54b0 100644
--- a/Python/initconfig.c
+++ b/Python/initconfig.c
@@ -10,7 +10,9 @@
#include "pycore_pystate.h" // _PyThreadState_GET()
#include "osdefs.h" // DELIM
+
#include <locale.h> // setlocale()
+#include <stdlib.h> // getenv()
#if defined(MS_WINDOWS) || defined(__CYGWIN__)
# ifdef HAVE_IO_H
# include <io.h>
diff --git a/Python/preconfig.c b/Python/preconfig.c
index d592731..afa16cc 100644
--- a/Python/preconfig.c
+++ b/Python/preconfig.c
@@ -4,7 +4,9 @@
#include "pycore_initconfig.h" // _PyArgv
#include "pycore_pymem.h" // _PyMem_GetAllocatorName()
#include "pycore_runtime.h" // _PyRuntime_Initialize()
+
#include <locale.h> // setlocale()
+#include <stdlib.h> // getenv()
/* Forward declarations */
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index c67a9b7..c5a209a 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -16,6 +16,7 @@
#include "pycore_traceback.h" // _Py_DumpTracebackThreads()
#include <locale.h> // setlocale()
+#include <stdlib.h> // getenv()
#if defined(__APPLE__)
#include <mach-o/loader.h>
diff --git a/Python/pystrhex.c b/Python/pystrhex.c
index f7fe3b6..880af44 100644
--- a/Python/pystrhex.c
+++ b/Python/pystrhex.c
@@ -1,8 +1,8 @@
/* Format bytes as hexadecimal */
#include "Python.h"
-#include "pycore_strhex.h" // _Py_strhex_with_sep()
-
+#include "pycore_strhex.h" // _Py_strhex_with_sep()
+#include <stdlib.h> // abs()
static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen,
const PyObject* sep, int bytes_per_sep_group,