https://github.com/python/cpython/commit/a5776639c8fde8b3b7c90821ab78ddb64130f4c0
commit: a5776639c8fde8b3b7c90821ab78ddb64130f4c0
branch: main
author: Victor Stinner <vstin...@python.org>
committer: vstinner <vstin...@python.org>
date: 2025-03-14T09:52:15Z
summary:

gh-111178: Fix function signatures to fix undefined behavior (#131191)

files:
M Modules/_threadmodule.c
M Objects/codeobject.c
M Objects/genobject.c
M Objects/iterobject.c
M Python/lock.c

diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c
index 4862b24fa93314..ef045fce3df9aa 100644
--- a/Modules/_threadmodule.c
+++ b/Modules/_threadmodule.c
@@ -461,8 +461,9 @@ ThreadHandle_start(ThreadHandle *self, PyObject *func, 
PyObject *args,
 }
 
 static int
-join_thread(ThreadHandle *handle)
+join_thread(void *arg)
 {
+    ThreadHandle *handle = (ThreadHandle*)arg;
     assert(get_thread_handle_state(handle) == THREAD_HANDLE_RUNNING);
     PyThread_handle_t os_handle;
     if (ThreadHandle_get_os_handle(handle, &os_handle)) {
@@ -536,8 +537,7 @@ ThreadHandle_join(ThreadHandle *self, PyTime_t timeout_ns)
         }
     }
 
-    if (_PyOnceFlag_CallOnce(&self->once, (_Py_once_fn_t *)join_thread,
-                             self) == -1) {
+    if (_PyOnceFlag_CallOnce(&self->once, join_thread, self) == -1) {
         return -1;
     }
     assert(get_thread_handle_state(self) == THREAD_HANDLE_DONE);
diff --git a/Objects/codeobject.c b/Objects/codeobject.c
index 60563ea7575604..90f0bfb7b92b7e 100644
--- a/Objects/codeobject.c
+++ b/Objects/codeobject.c
@@ -1361,7 +1361,8 @@ lineiter_dealloc(PyObject *self)
 }
 
 static PyObject *
-_source_offset_converter(int *value) {
+_source_offset_converter(void *arg) {
+    int *value = (int*)arg;
     if (*value == -1) {
         Py_RETURN_NONE;
     }
diff --git a/Objects/genobject.c b/Objects/genobject.c
index 79aed8571c35e7..2f70df79a3d3b0 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -590,8 +590,9 @@ _gen_throw(PyGenObject *gen, int close_on_genexit,
 
 
 static PyObject *
-gen_throw(PyGenObject *gen, PyObject *const *args, Py_ssize_t nargs)
+gen_throw(PyObject *op, PyObject *const *args, Py_ssize_t nargs)
 {
+    PyGenObject *gen = _PyGen_CAST(op);
     PyObject *typ;
     PyObject *tb = NULL;
     PyObject *val = NULL;
@@ -821,8 +822,9 @@ static PyMemberDef gen_memberlist[] = {
 };
 
 static PyObject *
-gen_sizeof(PyGenObject *gen, PyObject *Py_UNUSED(ignored))
+gen_sizeof(PyObject *op, PyObject *Py_UNUSED(ignored))
 {
+    PyGenObject *gen = _PyGen_CAST(op);
     Py_ssize_t res;
     res = offsetof(PyGenObject, gi_iframe) + offsetof(_PyInterpreterFrame, 
localsplus);
     PyCodeObject *code = _PyGen_GetCode(gen);
@@ -837,7 +839,7 @@ static PyMethodDef gen_methods[] = {
     {"send", gen_send, METH_O, send_doc},
     {"throw", _PyCFunction_CAST(gen_throw), METH_FASTCALL, throw_doc},
     {"close", gen_close, METH_NOARGS, close_doc},
-    {"__sizeof__", (PyCFunction)gen_sizeof, METH_NOARGS, sizeof__doc__},
+    {"__sizeof__", gen_sizeof, METH_NOARGS, sizeof__doc__},
     {"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See 
PEP 585")},
     {NULL, NULL}        /* Sentinel */
 };
@@ -1197,7 +1199,7 @@ static PyMethodDef coro_methods[] = {
     {"send", gen_send, METH_O, coro_send_doc},
     {"throw",_PyCFunction_CAST(gen_throw), METH_FASTCALL, coro_throw_doc},
     {"close", gen_close, METH_NOARGS, coro_close_doc},
-    {"__sizeof__", (PyCFunction)gen_sizeof, METH_NOARGS, sizeof__doc__},
+    {"__sizeof__", gen_sizeof, METH_NOARGS, sizeof__doc__},
     {"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See 
PEP 585")},
     {NULL, NULL}        /* Sentinel */
 };
@@ -1288,7 +1290,7 @@ static PyObject *
 coro_wrapper_throw(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
 {
     PyCoroWrapper *cw = _PyCoroWrapper_CAST(self);
-    return gen_throw((PyGenObject *)cw->cw_coroutine, args, nargs);
+    return gen_throw((PyObject*)cw->cw_coroutine, args, nargs);
 }
 
 static PyObject *
@@ -1625,7 +1627,7 @@ static PyMethodDef async_gen_methods[] = {
     {"asend", (PyCFunction)async_gen_asend, METH_O, async_asend_doc},
     {"athrow",(PyCFunction)async_gen_athrow, METH_VARARGS, async_athrow_doc},
     {"aclose", (PyCFunction)async_gen_aclose, METH_NOARGS, async_aclose_doc},
-    {"__sizeof__", (PyCFunction)gen_sizeof, METH_NOARGS, sizeof__doc__},
+    {"__sizeof__", gen_sizeof, METH_NOARGS, sizeof__doc__},
     {"__class_getitem__",    Py_GenericAlias,
     METH_O|METH_CLASS,       PyDoc_STR("See PEP 585")},
     {NULL, NULL}        /* Sentinel */
@@ -1842,7 +1844,7 @@ async_gen_asend_throw(PyObject *self, PyObject *const 
*args, Py_ssize_t nargs)
         o->ags_gen->ag_running_async = 1;
     }
 
-    PyObject *result = gen_throw((PyGenObject*)o->ags_gen, args, nargs);
+    PyObject *result = gen_throw((PyObject*)o->ags_gen, args, nargs);
     result = async_gen_unwrap_value(o->ags_gen, result);
 
     if (result == NULL) {
@@ -2249,7 +2251,7 @@ async_gen_athrow_throw(PyObject *self, PyObject *const 
*args, Py_ssize_t nargs)
         o->agt_gen->ag_running_async = 1;
     }
 
-    PyObject *retval = gen_throw((PyGenObject*)o->agt_gen, args, nargs);
+    PyObject *retval = gen_throw((PyObject*)o->agt_gen, args, nargs);
     if (o->agt_args) {
         retval = async_gen_unwrap_value(o->agt_gen, retval);
         if (retval == NULL) {
diff --git a/Objects/iterobject.c b/Objects/iterobject.c
index 87e30d6922ca56..8b33a7ded3ffd6 100644
--- a/Objects/iterobject.c
+++ b/Objects/iterobject.c
@@ -200,8 +200,9 @@ PyCallIter_New(PyObject *callable, PyObject *sentinel)
     return (PyObject *)it;
 }
 static void
-calliter_dealloc(calliterobject *it)
+calliter_dealloc(PyObject *op)
 {
+    calliterobject *it = (calliterobject*)op;
     _PyObject_GC_UNTRACK(it);
     Py_XDECREF(it->it_callable);
     Py_XDECREF(it->it_sentinel);
@@ -217,8 +218,9 @@ calliter_traverse(calliterobject *it, visitproc visit, void 
*arg)
 }
 
 static PyObject *
-calliter_iternext(calliterobject *it)
+calliter_iternext(PyObject *op)
 {
+    calliterobject *it = (calliterobject*)op;
     PyObject *result;
 
     if (it->it_callable == NULL) {
@@ -249,8 +251,9 @@ calliter_iternext(calliterobject *it)
 }
 
 static PyObject *
-calliter_reduce(calliterobject *it, PyObject *Py_UNUSED(ignored))
+calliter_reduce(PyObject *op, PyObject *Py_UNUSED(ignored))
 {
+    calliterobject *it = (calliterobject*)op;
     PyObject *iter = _PyEval_GetBuiltin(&_Py_ID(iter));
 
     /* _PyEval_GetBuiltin can invoke arbitrary code,
@@ -264,7 +267,7 @@ calliter_reduce(calliterobject *it, PyObject 
*Py_UNUSED(ignored))
 }
 
 static PyMethodDef calliter_methods[] = {
-    {"__reduce__", (PyCFunction)calliter_reduce, METH_NOARGS, reduce_doc},
+    {"__reduce__", calliter_reduce, METH_NOARGS, reduce_doc},
     {NULL,              NULL}           /* sentinel */
 };
 
@@ -274,7 +277,7 @@ PyTypeObject PyCallIter_Type = {
     sizeof(calliterobject),                     /* tp_basicsize */
     0,                                          /* tp_itemsize */
     /* methods */
-    (destructor)calliter_dealloc,               /* tp_dealloc */
+    calliter_dealloc,                           /* tp_dealloc */
     0,                                          /* tp_vectorcall_offset */
     0,                                          /* tp_getattr */
     0,                                          /* tp_setattr */
@@ -296,7 +299,7 @@ PyTypeObject PyCallIter_Type = {
     0,                                          /* tp_richcompare */
     0,                                          /* tp_weaklistoffset */
     PyObject_SelfIter,                          /* tp_iter */
-    (iternextfunc)calliter_iternext,            /* tp_iternext */
+    calliter_iternext,                          /* tp_iternext */
     calliter_methods,                           /* tp_methods */
 };
 
diff --git a/Python/lock.c b/Python/lock.c
index f2067ee2cd5f37..28a12ad18352d1 100644
--- a/Python/lock.c
+++ b/Python/lock.c
@@ -137,8 +137,10 @@ _PyMutex_LockTimed(PyMutex *m, PyTime_t timeout, 
_PyLockFlags flags)
 }
 
 static void
-mutex_unpark(PyMutex *m, struct mutex_entry *entry, int has_more_waiters)
+mutex_unpark(void *arg, void *park_arg, int has_more_waiters)
 {
+    PyMutex *m = (PyMutex*)arg;
+    struct mutex_entry *entry = (struct mutex_entry*)park_arg;
     uint8_t v = 0;
     if (entry) {
         PyTime_t now;
@@ -168,7 +170,7 @@ _PyMutex_TryUnlock(PyMutex *m)
         }
         else if ((v & _Py_HAS_PARKED)) {
             // wake up a single thread
-            _PyParkingLot_Unpark(&m->_bits, (_Py_unpark_fn_t *)mutex_unpark, 
m);
+            _PyParkingLot_Unpark(&m->_bits, mutex_unpark, m);
             return 0;
         }
         else if (_Py_atomic_compare_exchange_uint8(&m->_bits, &v, 
_Py_UNLOCKED)) {

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to