Antti Haapala <[email protected]> added the comment:
Yea, I looked into `ceval.c` and the function is *called incorrectly*, so there
is undefined behaviour there - it has been wrong all along, in 3.5 all the way
down to 2-something
if (flags & (METH_NOARGS | METH_O)) {
PyCFunction meth = PyCFunction_GET_FUNCTION(func);
PyObject *self = PyCFunction_GET_SELF(func);
if (flags & METH_NOARGS && na == 0) {
C_TRACE(x, (*meth)(self,NULL));
x = _Py_CheckFunctionResult(func, x, NULL);
}
The warning in GCC shouldn't probably have been enabled at all in `-Wall
-Wextra` because the cast is explicit. However, it is somewhat true.
However, the correct way to fix would be to have the METH_NOARGS case cast the
function to the right prototype. There exists lots of existing code that *is*
going to break too.
Perhaps PyCFunction should declare no prototype, i.e. empty parentheses, for
backwards compatibility:
typedef PyObject *(*PyCFunction)();
and deprecate it; start using a new typedef for it - and then add proper casts
in every place that call a function.
----------
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue33012>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com