Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Crash in QListData::realloc(), Datarace condition found during Image Download



    • I have created a sample app containing two threads - one thread downloads the images and the main thread will be informed continuously about the download from the download thread.
    • We ran with the valgrind and found the below datarace condition continuously.
    • The datarace condition between QObject::moveToThread() and QCoreApplication::postEvent().
    • I am using Qt_4.8.0

    ==16049== Possible data race during read of size 4 at 0x6aecee4 by thread #4
    ==16049== at 0x629BE7B: QObjectPrivate::setThreadData_helper(QThreadData*, QThreadData*) (in /usr/local/Qt/lib/libQtCore.so.4.8.0)
    ==16049== by 0x629C2C9: QObject::moveToThread(QThread*) (in /usr/local/Qt/lib/libQtCore.so.4.8.0)
    ==16049== by 0x607450C: QNetworkAccessHttpBackend::postRequest() (qnetworkaccesshttpbackend.cpp:534)
    ==16049== by 0x6075097: QNetworkAccessHttpBackend::open() (qnetworkaccesshttpbackend.cpp:702)
    ==16049== by 0x606C99D: QNetworkAccessBackend::start() (qnetworkaccessbackend.cpp:418)
    ==16049== by 0x60826F3: QNetworkReplyImplPrivate::_q_startOperation() (qnetworkreplyimpl.cpp:93)
    ==16049== by 0x6084281: QNetworkReplyImplPrivate::setup(QNetworkAccessManager::Operation, QNetworkRequest const&, QIODevice*) (qnetworkreplyimpl.cpp:378)
    ==16049== by 0x60661D5: QNetworkAccessManager::createRequest(QNetworkAccessManager::Operation, QNetworkRequest const&, QIODevice*) (qnetworkaccessmanager.cpp:1008)
    ==16049== by 0x60651E0: QNetworkAccessManager::get(QNetworkRequest const&) (qnetworkaccessmanager.cpp:599)
    ==16049== by 0x8049740: CImageDecodingThreadSample::loadFromNetwork(QUrl) (in /mnt/nfs/env/Receiver)
    ==16049== by 0x80497CC: CImageDecodingThreadSample::LoadImage(QString) (in /mnt/nfs/env/Receiver)
    ==16049== by 0x804994E: CImageDecodingThreadSample::onStarted() (in /mnt/nfs/env/Receiver)
    ==16049== This conflicts with a previous write of size 4 by thread #1
    ==16049== at 0x61A68F8: QListData::realloc(int) (in /usr/local/Qt/lib/libQtCore.so.4.8.0)
    ==16049== by 0x61A6993: QListData::append(int) (in /usr/local/Qt/lib/libQtCore.so.4.8.0)
    ==16049== by 0x61A6A15: QListData::append() (in /usr/local/Qt/lib/libQtCore.so.4.8.0)
    ==16049== by 0x628CD17: ??? (in /usr/local/Qt/lib/libQtCore.so.4.8.0)
    ==16049== by 0x628C591: QCoreApplication::postEvent(QObject*, QEvent*, int) (in /usr/local/Qt/lib/libQtCore.so.4.8.0)
    ==16049== by 0x628C63C: QCoreApplication::postEvent(QObject*, QEvent*) (in /usr/local/Qt/lib/libQtCore.so.4.8.0)
    ==16049== by 0x629DC21: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/local/Qt/lib/libQtCore.so.4.8.0)
    ==16049== by 0x62EC4F7: QTimer::timeout() (in /usr/local/Qt/lib/libQtCore.so.4.8.0)
    ==16049== Address 0x6aecee4 is 28 bytes inside a block of size 60 alloc'd
    ==16049== at 0x402461D: operator new(unsigned int) (vg_replace_malloc.c:255)
    ==16049== by 0x618525B: ??? (in /usr/local/Qt/lib/libQtCore.so.4.8.0)
    ==16049== by 0x61852EB: QThread::QThread(QObject*) (in /usr/local/Qt/lib/libQtCore.so.4.8.0)
    ==16049== by 0x80494ED: CImageResourceSample::CImageResourceSample() (in /mnt/nfs/env/Receiver)
    ==16049== by 0x80495FF: CImageResourceSample::getInstance() (in /mnt/nfs/env/Receiver)
    ==16049== by 0x8049301: main (in /mnt/nfs/env/Receiver)

    We are using for Embedded platform unix.
    Kindly let us the know the root cause for the race condition.



  • The root cause is faulty code. Without seeing your code it's hard to tell where the problem is exactly.


Log in to reply