Custom type: PyObject_IS_GC access violation

"Martin v. Löwis" martin at v.loewis.de
Sun Jun 12 13:09:15 EDT 2005


Bue Krogh Vedel-Larsen wrote:

> But if I call
> 
> SA_PyVector_Type.tp_new = PyType_GenericNew;
> PyType_Ready( &SA_PyVector_Type );
> 
> then, when Py_Finalize is called, PyObject_IS_GC(op) in visit_decref() in 
> gcmodule.c causes an access violation. If I don't call PyType_Ready, then 
> the access violation doesn't occure, but then the type can't be used...
> 
> So, the question is, does anyone have any idea about what could be 
> causing this?

Most likely some code that you haven't shown. Here is the expansion
of PyObject_IS_GC(op)

#define PyObject_IS_GC(o) (PyType_IS_GC((o)->ob_type) && \
        ((o)->ob_type->tp_is_gc == NULL || (o)->ob_type->tp_is_gc(o)))

so it becomes

PyType_IS_GC(op->type) && (op->ob_type->tp_is_gc==NULL ||
op->ob_type->tp_is_gc(op))

Then, PyType_IS_GC(op->type) becomes

PyType_HasFeature((op->type), Py_TPFLAGS_HAVE_GC)

which in turn becomes

(op->tp_flags & Py_TPFLAGS_HAVE_GC) != 0

So typically, PyObject_IS_GC goes to the type of the object,
which should never crash, and then looks into the flags of
the type, which cannot crash - unless somebody messed with
ob_type of the object, and unless this isn't a Python
object in the first place.

You did not say what kind of object op was in the crash - this
is something you should investigate further. Does it point to
a Python object? If so, what is the type of the Python object?

Regards,
Martin



More information about the Python-list mailing list