Hi Phil,

I managed to reduce another small crashing testcase:

==========================================
#!/usr/bin/env python
from qt import *
import weakref

class myref(weakref.ref):
    pass

a = QObject(None)
wr = myref(a)
wr._callback = lambda: wr
QObject.connect(a, SIGNAL("destroyed()"), wr._callback)
del a
print "OK!"
==========================================


Purify gives me this output:


[W] UMR: Uninitialized memory read in sip_api_emit_to_slot {1 occurrence}
    Reading 4 bytes from 0x0276aec0 (4 bytes at 0x0276aec0 uninitialized)
    Address 0x0276aec0 is 72 bytes into a 80 byte block at 0x0276ae78
    Address 0x0276aec0 points to a C++ new block in heap 0x02640000
    Thread ID: 0x7bc


    Error location

    sip_api_emit_to_slot [sip\siplib\qtlib.c:614]
                return 0;
            }

=> if ((sfunc = PyMethod_New(slot->meth.mfunc, self, slot->meth.mclass)) == NULL)
            {
                Py_XDECREF(sref);
                return -1;
    UniversalSlot::qt_invoke(int,QUObject *) [pyqt\sip\qt\qobject.sip:1202]
            }

            // Dispatch to the real slot.
 =>         if (ok && sipEmitToSlot(&conn.sc_slot, argtup) < 0)
                ok = FALSE;

            Py_DECREF(argtup);
    QObject::activate_signal(QConnectionList *,QUObject *) [qt.pyd]
    QObject::activate_signal(int) [qt.pyd]
    QObject::destroyed(void) [qt.pyd]
    sipQObject::~sipQObject(void) [qt.pyd]
    sipQObject::`scalar deleting destructor'(UINT) [qt.pyd]
    release_QObject [qt.pyd]
    dealloc_QObject [qt.pyd]
    sipWrapper_dealloc [sip\siplib\siplib.c:6379]
    subtype_dealloc [d:\python-2.4.2\objects\typeobject.c:703]
    PyDict_DelItem [d:\python-2.4.2\objects\dictobject.c:601]
    dict_ass_sub   [d:\python-2.4.2\objects\dictobject.c:893]
    PyObject_DelItem [d:\python-2.4.2\objects\abstract.c:155]
    PyEval_EvalFrame [d:\python-2.4.2\python\ceval.c:1715]


    Allocation location

     [C:\Python24\MSVCR71.dll ip=0x5C367F07]
    sipQtCreateUniversalSlot [pyqt\sip\qt\qobject.sip:1250]
        if (tx && PyObject_TypeCheck(tx, (PyTypeObject *)sipClass_QObject))
                qtx = reinterpret_cast<QObject *>(conn->sc_transmitter);

     =>     return new UniversalSlot(qtx, conn, member);
        }


    createUniversalSlot [sip\siplib\qtlib.c:447]
                return 0;

            /* Parse the signature and create the universal slot. */
=> if ((conn.sc_signature = parseSignature(sig)) == NULL || (us = sipQtSupport->qt_create_universal_slot(txSelf, &conn, member)) == NULL)
            {
                sip_api_free_connection(&conn);
                return 0;
    sip_api_convert_rx [sip\siplib\qtlib.c:916]
                     const char *slot,const char **memberp)
        {
            if (slot == NULL)
=> return createUniversalSlot(txSelf, sig, rxObj, NULL, memberp);

            if (isQtSlot(slot) || isQtSignal(slot))
            {
    sip_api_connect_rx [sip\siplib\qtlib.c:962]
    meth_QObject_connect [pyqt\qt\qobject.sip:603]
    PyCFunction_Call [d:\python-2.4.2\objects\methodobject.c:73]
    call_function  [d:\python-2.4.2\python\ceval.c:3558]
    PyEval_EvalFrame [d:\python-2.4.2\python\ceval.c:2163]
    PyEval_EvalCodeEx [d:\python-2.4.2\python\ceval.c:2736]


Hope this helps!
--
Giovanni Bajo

_______________________________________________
PyKDE mailing list    [email protected]
http://mats.imk.fraunhofer.de/mailman/listinfo/pykde

Reply via email to