SIP gc assert

Phil Thompson phil at riverbankcomputing.com
Wed Apr 12 14:15:16 BST 2023


On 12/04/2023 00:09, Mark Roszko wrote:
> We are finding that the generated descriptors.c that comes
> from sip_descriptors.c is causing crash asserts in python 3.11. One
> notable reason is python 3.11 introduced asserts in various places to
> stay on top of object lifetime
> 
> The assert looks like this
> 
>> gcmodule.c:442: update_refs: Assertion "gc_get_refs(gc) != 0" failed
>> Enable tracemalloc to get the memory block allocation traceback
> 
>> object address : 000002C59FF0EF80
>> object refcount : 0
>> object type : 00007FFC02AA71C0
>> object type name: sip.methoddescriptor
>> object repr : <refcnt 0 at 000002C59FF0EF80>
> 
>> Fatal Python error: _PyObject_AssertFailed: _PyObject_AssertFailed
>> Python runtime state: initialized
> 
> After research, both sipMethodDescr_Type and sipVariableDescr_Type
> have the Py_TPFLAGS_HAVE_GC flag set.
> 
> Per the python 3.11 manual for the HAVE_GC flag. The function
> PyObject_GC_UnTrack should be called first in the dealloc slot
> function before doing anything else
> 
> Adding the PyObject_GC_UnTrack calls appears to fix the assert for us

Should be fixed in the next snapshot.

Thanks,
Phil


More information about the PyQt mailing list