Description
As seen here: https://codereview.qt-project.org/#change,52828
and reduced to the following:
#include <QStringList> #include <QCoreApplication> #include "private/qnetworkconfigmanager_p.h" #include "private/qbearerengine_p.h" struct HoldingType : public QObject { HoldingType() { QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate(); QBearerEngine *engine = priv->engines()[0]; QStringList keys = engine->accessPointConfigurations.keys(); networkConfiguration.d = engine->accessPointConfigurations[keys[0]]; } QNetworkConfiguration networkConfiguration; }; class QSampleCache { public: QSampleCache() : t(0) { } ~QSampleCache() { delete t; } HoldingType* networkAccessManager() { if (!t) t = new HoldingType; return t; } private: HoldingType *t; }; Q_GLOBAL_STATIC(QSampleCache, sampleCache) int main(int argc, char **argv) { QCoreApplication app(argc, argv); sampleCache->networkAccessManager(); }
There is a segfault on exit
Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7ae64d8 in QExplicitlySharedDataPointer<QNetworkConfigurationPrivate>::~QExplicitlySharedDataPointer (this=0x60b870, __in_chrg=<optimized out>) at ../../include/QtCore/../../../../../src/qtbase/src/corelib/tools/qshareddata.h:163 163 inline ~QExplicitlySharedDataPointer() { if (d && !d->ref.deref()) delete d; } (gdb) bt #0 0x00007ffff7ae64d8 in QExplicitlySharedDataPointer<QNetworkConfigurationPrivate>::~QExplicitlySharedDataPointer (this=0x60b870, __in_chrg=<optimized out>) at ../../include/QtCore/../../../../../src/qtbase/src/corelib/tools/qshareddata.h:163 #1 0x00007ffff7ae5a62 in QNetworkConfiguration::~QNetworkConfiguration (this=0x60b870, __in_chrg=<optimized out>) at /home/stephen/dev/src/qtbase/src/network/bearer/qnetworkconfiguration.cpp:227 #2 0x00007ffff7aa7df5 in QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate (this=0x60b7a0, __in_chrg=<optimized out>) at /home/stephen/dev/src/qtbase/src/network/access/qnetworkaccessmanager.cpp:1370 #3 0x00007ffff7aa7e82 in QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate (this=0x60b7a0, __in_chrg=<optimized out>) at /home/stephen/dev/src/qtbase/src/network/access/qnetworkaccessmanager.cpp:1381 #4 0x00007ffff6bdc814 in QScopedPointerDeleter<QObjectData>::cleanup (pointer=0x60b7a0) at ../../include/QtCore/../../../../../src/qtbase/src/corelib/tools/qscopedpointer.h:62 #5 0x00007ffff6bdae9d in QScopedPointer<QObjectData, QScopedPointerDeleter<QObjectData> >::~QScopedPointer (this=0x60b788, __in_chrg=<optimized out>) at ../../include/QtCore/../../../../../src/qtbase/src/corelib/tools/qscopedpointer.h:98 #6 0x00007ffff6bd02f4 in QObject::~QObject (this=0x60b780, __in_chrg=<optimized out>) at /home/stephen/dev/src/qtbase/src/corelib/kernel/qobject.cpp:750 #7 0x00007ffff7aa5a9b in QNetworkAccessManager::~QNetworkAccessManager (this=0x60b780, __in_chrg=<optimized out>) at /home/stephen/dev/src/qtbase/src/network/access/qnetworkaccessmanager.cpp:475 #8 0x00007ffff7aa5ad2 in QNetworkAccessManager::~QNetworkAccessManager (this=0x60b780, __in_chrg=<optimized out>) at /home/stephen/dev/src/qtbase/src/network/access/qnetworkaccessmanager.cpp:490 #9 0x00000000004037fa in QSampleCache::~QSampleCache (this=0x606220 <(anonymous namespace)::Q_QGS_sampleCache::innerFunction()::holder>, __in_chrg=<optimized out>) at tst_qsound.cpp:20 #10 0x0000000000402f23 in (anonymous namespace)::Q_QGS_sampleCache::Holder::~Holder (this=0x606220 <(anonymous namespace)::Q_QGS_sampleCache::innerFunction()::holder>, __in_chrg=<optimized out>) at tst_qsound.cpp:37 #11 0x00007ffff600a121 in __run_exit_handlers (status=0, listp=0x7ffff638f6a8 <__exit_funcs>, run_list_atexit=run_list_atexit@entry=true) at exit.c:77 #12 0x00007ffff600a1a5 in __GI_exit (status=<optimized out>) at exit.c:99 #13 0x00007ffff5fefeac in __libc_start_main (main=0x402fe1 <main(int, char**)>, argc=1, ubp_av=0x7fffffffd678, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffd668) at libc-start.c:294 #14 0x0000000000401cf9 in _start ()
==11598== Memcheck, a memory error detector ==11598== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al. ==11598== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info ==11598== Command: ./tst_qsound ==11598== ==11598== Invalid read of size 8 ==11598== at 0x4ED04D8: QExplicitlySharedDataPointer<QNetworkConfigurationPrivate>::~QExplicitlySharedDataPointer() (in /home/stephen/dev/prefix/qtbase/lib/libQt5Network.so.5.2.0) ==11598== by 0x4ECFA61: QNetworkConfiguration::~QNetworkConfiguration() (qnetworkconfiguration.cpp:227) ==11598== by 0x4E91DF4: QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate() (qnetworkaccessmanager.cpp:1370) ==11598== by 0x4E91E81: QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate() (qnetworkaccessmanager.cpp:1381) ==11598== by 0x5EC2813: QScopedPointerDeleter<QObjectData>::cleanup(QObjectData*) (qscopedpointer.h:62) ==11598== by 0x5EC0E9C: QScopedPointer<QObjectData, QScopedPointerDeleter<QObjectData> >::~QScopedPointer() (qscopedpointer.h:98) ==11598== by 0x5EB62F3: QObject::~QObject() (qobject.cpp:750) ==11598== by 0x4E8FA9A: QNetworkAccessManager::~QNetworkAccessManager() (qnetworkaccessmanager.cpp:475) ==11598== by 0x4E8FAD1: QNetworkAccessManager::~QNetworkAccessManager() (qnetworkaccessmanager.cpp:490) ==11598== by 0x4037F9: QSampleCache::~QSampleCache() (tst_qsound.cpp:20) ==11598== by 0x402F22: (anonymous namespace)::Q_QGS_sampleCache::innerFunction()::Holder::~Holder() (tst_qsound.cpp:37) ==11598== by 0x68B4120: __run_exit_handlers (exit.c:77) ==11598== Address 0xcdb0778 is not stack'd, malloc'd or (recently) free'd ==11598== ==11598== ==11598== Process terminating with default action of signal 11 (SIGSEGV) ==11598== Access not within mapped region at address 0xCDB0778 ==11598== at 0x4ED04D8: QExplicitlySharedDataPointer<QNetworkConfigurationPrivate>::~QExplicitlySharedDataPointer() (in /home/stephen/dev/prefix/qtbase/lib/libQt5Network.so.5.2.0) ==11598== by 0x4ECFA61: QNetworkConfiguration::~QNetworkConfiguration() (qnetworkconfiguration.cpp:227) ==11598== by 0x4E91DF4: QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate() (qnetworkaccessmanager.cpp:1370) ==11598== by 0x4E91E81: QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate() (qnetworkaccessmanager.cpp:1381) ==11598== by 0x5EC2813: QScopedPointerDeleter<QObjectData>::cleanup(QObjectData*) (qscopedpointer.h:62) ==11598== by 0x5EC0E9C: QScopedPointer<QObjectData, QScopedPointerDeleter<QObjectData> >::~QScopedPointer() (qscopedpointer.h:98) ==11598== by 0x5EB62F3: QObject::~QObject() (qobject.cpp:750) ==11598== by 0x4E8FA9A: QNetworkAccessManager::~QNetworkAccessManager() (qnetworkaccessmanager.cpp:475) ==11598== by 0x4E8FAD1: QNetworkAccessManager::~QNetworkAccessManager() (qnetworkaccessmanager.cpp:490) ==11598== by 0x4037F9: QSampleCache::~QSampleCache() (tst_qsound.cpp:20) ==11598== by 0x402F22: (anonymous namespace)::Q_QGS_sampleCache::innerFunction()::Holder::~Holder() (tst_qsound.cpp:37) ==11598== by 0x68B4120: __run_exit_handlers (exit.c:77) ==11598== If you believe this happened as a result of a stack ==11598== overflow in your program's main thread (unlikely but ==11598== possible), you can try to increase the size of the ==11598== main thread stack using the --main-stacksize= flag. ==11598== The main thread stack size used in this run was 8388608. ==11598== ==11598== HEAP SUMMARY: ==11598== in use at exit: 38,731 bytes in 152 blocks ==11598== total heap usage: 79,534 allocs, 79,382 frees, 4,805,467 bytes allocated ==11598== ==11598== LEAK SUMMARY: ==11598== definitely lost: 1,692 bytes in 23 blocks ==11598== indirectly lost: 12,765 bytes in 14 blocks ==11598== possibly lost: 5,392 bytes in 15 blocks ==11598== still reachable: 18,882 bytes in 100 blocks ==11598== suppressed: 0 bytes in 0 blocks ==11598== Rerun with --leak-check=full to see details of leaked memory ==11598== ==11598== For counts of detected and suppressed errors, rerun with: -v ==11598== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2) Segmentation fault (core dumped)