bpo-36381: warn when no PY_SSIZE_T_CLEAN defined (GH-12473)
authorInada Naoki <songofacandy@gmail.com>
Sat, 23 Mar 2019 12:04:40 +0000 (21:04 +0900)
committerGitHub <noreply@github.com>
Sat, 23 Mar 2019 12:04:40 +0000 (21:04 +0900)
We will remove int support from 3.10 or 4.0.

Doc/whatsnew/3.8.rst
Misc/NEWS.d/next/C API/2019-03-20-22-02-40.bpo-36381.xlzDJ2.rst [new file with mode: 0644]
Python/getargs.c
Python/modsupport.c

index 18ec2c2f662dd06fe9c29ab2581a0fb7df30878a..3855d3604e1cdbb4c824492ba714ccdedf04c961 100644 (file)
@@ -708,6 +708,16 @@ Changes in the Python API
   set for regular user accounts.
 
 
+Changes in the C API
+--------------------
+
+* Use of ``#`` variants of formats in parsing or building value (e.g.
+  :c:func:`PyArg_ParseTuple`, :c:func:`Py_BuildValue`, :c:func:`PyObject_CallFunction`,
+  etc.) without ``PY_SSIZE_T_CLEAN`` defined raises ``DeprecationWarning`` now.
+  It will be removed in 3.10 or 4.0.  Read :ref:`arg-parsing` for detail.
+  (Contributed by Inada Naoki in :issue:`36381`.)
+
+
 CPython bytecode changes
 ------------------------
 
diff --git a/Misc/NEWS.d/next/C API/2019-03-20-22-02-40.bpo-36381.xlzDJ2.rst b/Misc/NEWS.d/next/C API/2019-03-20-22-02-40.bpo-36381.xlzDJ2.rst
new file mode 100644 (file)
index 0000000..66982aa
--- /dev/null
@@ -0,0 +1,2 @@
+Raise ``DeprecationWarning`` when '#' formats are used for building or
+parsing values without ``PY_SSIZE_T_CLEAN``.
index e50f9b5f5c9dcd78a391bba9f3da66209c6fa574..59f0fdabb74a656f0e0ea1e98ea94a82c6c85691 100644 (file)
@@ -681,7 +681,13 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
     /* For # codes */
 #define FETCH_SIZE      int *q=NULL;Py_ssize_t *q2=NULL;\
     if (flags & FLAG_SIZE_T) q2=va_arg(*p_va, Py_ssize_t*); \
-    else q=va_arg(*p_va, int*);
+    else { \
+        if (PyErr_WarnEx(PyExc_DeprecationWarning, \
+                    "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) { \
+            return NULL; \
+        } \
+        q=va_arg(*p_va, int*); \
+    }
 #define STORE_SIZE(s)   \
     if (flags & FLAG_SIZE_T) \
         *q2=s; \
@@ -2591,8 +2597,13 @@ skipitem(const char **p_format, va_list *p_va, int flags)
                 if (p_va != NULL) {
                     if (flags & FLAG_SIZE_T)
                         (void) va_arg(*p_va, Py_ssize_t *);
-                    else
+                    else {
+                        if (PyErr_WarnEx(PyExc_DeprecationWarning,
+                                    "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
+                            return NULL;
+                        }
                         (void) va_arg(*p_va, int *);
+                    }
                 }
                 format++;
             } else if ((c == 's' || c == 'z' || c == 'y' || c == 'w')
index 8a77a7b06dc59b1cab3833e867d97686f37b6c42..62558221077468a7e9a7768b5e05dac1c88c916d 100644 (file)
@@ -342,8 +342,13 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)
                 ++*p_format;
                 if (flags & FLAG_SIZE_T)
                     n = va_arg(*p_va, Py_ssize_t);
-                else
+                else {
+                    if (PyErr_WarnEx(PyExc_DeprecationWarning,
+                                "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
+                        return NULL;
+                    }
                     n = va_arg(*p_va, int);
+                }
             }
             else
                 n = -1;
@@ -390,8 +395,13 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)
                 ++*p_format;
                 if (flags & FLAG_SIZE_T)
                     n = va_arg(*p_va, Py_ssize_t);
-                else
+                else {
+                    if (PyErr_WarnEx(PyExc_DeprecationWarning,
+                                "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
+                        return NULL;
+                    }
                     n = va_arg(*p_va, int);
+                }
             }
             else
                 n = -1;
@@ -423,8 +433,13 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)
                 ++*p_format;
                 if (flags & FLAG_SIZE_T)
                     n = va_arg(*p_va, Py_ssize_t);
-                else
+                else {
+                    if (PyErr_WarnEx(PyExc_DeprecationWarning,
+                                "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
+                        return NULL;
+                    }
                     n = va_arg(*p_va, int);
+                }
             }
             else
                 n = -1;