Message166372
| Author |
loewis |
| Recipients |
asvetlov, gregory.p.smith, jcea, loewis, mark.dickinson, meador.inge, serhiy.storchaka |
| Date |
2012年07月25日.09:06:25 |
| SpamBayes Score |
-1.0 |
| Marked as misclassified |
Yes |
| Message-id |
<500FB710.6090205@v.loewis.de> |
| In-reply-to |
<1343203910.38.0.537487048787.issue15402@psf.upfronthosting.co.za> |
| Content |
> Hmm. I see this usage in a lot of places---e.g. see
> unicode_capitalize, unicode_casefold, unicode_title etc. in
> Objects/unicodeobject.c. So it looks like we're relying on the
> (PyCFunction) cast to convert from a one-argument function pointer to
> a two-argument function pointer, which sounds a bit worrisome---I
> guess it just happens to work with common ABI calling conventions.
> I'm a bit surprised that we're not seeing compiler warnings about
> this sort of thing.
The compiler has no chance to find out. You cast the pointer to
PyCFunction, telling the compiler that it really is a PyCFunction.
I really wish we could put a ban on function pointer casts, and try
to make this all statically type-correct. This, of course, would
require the sizeof function to take PyObject*, and cast it to
PyStructObject * locally. My idiom for that is
static PyObject *
s_sizeof(PyStructObject *_self, PyObject *unused)
{
PyStructObject *self = (PyStructObject *)_self;
> It sounds like 'wrong everywhere' is accurate, unfortunately.
"Everywhere" is nowhere close to the truth. There are tons of
NOARGS functions which have the correct signature. |
|