Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-17770

A memory leak can occur in code which calls QDeclarativeTypeData::compile()

    XMLWordPrintable

Details

    Description

      A memory leak occurs in code which calls QDeclarativeTypeData::compile(), possibly due to the way that QDeclarativeTypeData::compiledData() addref()s the typedata before returning it. If calling code ever addref()s the typedata after retrieving it in this fashion, the refcount will never go back to zero, if the client balances their addref()s with release()s.

      Valgrind output is as follows:
      ==8972== 240 (32 direct, 208 indirect) bytes in 2 blocks are definitely lost in loss record 259 of 339
      ==8972== at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255)
      ==8972== by 0x42E40DE: QDeclarativeTypePrivate::init() const (qdeclarativemetatype.cpp:376)
      ==8972== by 0x42E47DA: QDeclarativeType::containsRevisionedAttributes() const (qdeclarativemetatype.cpp:536)
      ==8972== by 0x42B99E8: QDeclarativeCompiler::compile(QDeclarativeEngine*, QDeclarativeTypeData*, QDeclarativeCompiledData*) (qdeclarativecompiler.cpp:603)
      ==8972== by 0x42F3248: QDeclarativeTypeData::compile() (qdeclarativetypeloader.cpp:907)
      ==8972== by 0x42F2749: QDeclarativeTypeData::done() (qdeclarativetypeloader.cpp:824)
      ==8972== by 0x42EF876: QDeclarativeDataBlob::tryDone() (qdeclarativetypeloader.cpp:382)
      ==8972== by 0x42F097E: QDeclarativeDataLoader::setData(QDeclarativeDataBlob*, QByteArray const&) (qdeclarativetypeloader.cpp:615)
      ==8972== by 0x42F0238: QDeclarativeDataLoader::load(QDeclarativeDataBlob*) (qdeclarativetypeloader.cpp:512)
      ==8972== by 0x42F0F5E: QDeclarativeTypeLoader::get(QUrl const&) (qdeclarativetypeloader.cpp:645)
      ==8972== by 0x42A3FB8: QDeclarativeComponent::loadUrl(QUrl const&) (qdeclarativecomponent.cpp:536)
      ==8972== by 0x42A36C1: QDeclarativeComponent::QDeclarativeComponent(QDeclarativeEngine*, QUrl const&, QObject*) (qdeclarativecomponent.cpp:437)
      ==8972== by 0x80598F6: tst_qdeclarativeecmascript::extensionObjects() (tst_qdeclarativeecmascript.cpp:623)

      ==8972== 248 bytes in 2 blocks are definitely lost in loss record 261 of 339
      ==8972== at 0x4024F20: malloc (vg_replace_malloc.c:236)
      ==8972== by 0x5EB2FA0: qMalloc(unsigned int) (qmalloc.cpp:55)
      ==8972== by 0x433FF0B: QMetaObjectBuilder::toMetaObject() const (qmetaobjectbuilder.cpp:1450)
      ==8972== by 0x42E41CC: QDeclarativeTypePrivate::init() const (qdeclarativemetatype.cpp:390)
      ==8972== by 0x42E47DA: QDeclarativeType::containsRevisionedAttributes() const (qdeclarativemetatype.cpp:536)
      ==8972== by 0x42B99E8: QDeclarativeCompiler::compile(QDeclarativeEngine*, QDeclarativeTypeData*, QDeclarativeCompiledData*) (qdeclarativecompiler.cpp:603)
      ==8972== by 0x42F3248: QDeclarativeTypeData::compile() (qdeclarativetypeloader.cpp:907)
      ==8972== by 0x42F2749: QDeclarativeTypeData::done() (qdeclarativetypeloader.cpp:824)
      ==8972== by 0x42EF876: QDeclarativeDataBlob::tryDone() (qdeclarativetypeloader.cpp:382)
      ==8972== by 0x42F097E: QDeclarativeDataLoader::setData(QDeclarativeDataBlob*, QByteArray const&) (qdeclarativetypeloader.cpp:615)
      ==8972== by 0x42F08B7: QDeclarativeDataLoader::loadWithStaticData(QDeclarativeDataBlob*, QByteArray const&) (qdeclarativetypeloader.cpp:590)
      ==8972== by 0x42F1002: QDeclarativeTypeLoader::get(QByteArray const&, QUrl const&, QFlags<QDeclarativeTypeLoader::Option>) (qdeclarativetypeloader.cpp:659)
      ==8972== by 0x42A3C58: QDeclarativeComponent::setData(QByteArray const&, QUrl const&) (qdeclarativecomponent.cpp:484)
      ==8972== by 0x8063B6D: tst_qdeclarativeecmascript::bug2() (tst_qdeclarativeecmascript.cpp:1399)

      ==8972== 8,990 (120 direct, 8,870 indirect) bytes in 1 blocks are definitely lost in loss record 339 of 339
      ==8972== at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255)
      ==8972== by 0x42F30EA: QDeclarativeTypeData::compile() (qdeclarativetypeloader.cpp:901)
      ==8972== by 0x42F2749: QDeclarativeTypeData::done() (qdeclarativetypeloader.cpp:824)
      ==8972== by 0x42EF876: QDeclarativeDataBlob::tryDone() (qdeclarativetypeloader.cpp:382)
      ==8972== by 0x42F097E: QDeclarativeDataLoader::setData(QDeclarativeDataBlob*, QByteArray const&) (qdeclarativetypeloader.cpp:615)

      ==8972== by 0x42F0238: QDeclarativeDataLoader::load(QDeclarativeDataBlob*) (qdeclarativetypeloader.cpp:512)
      ==8972== by 0x42F0F5E: QDeclarativeTypeLoader::get(QUrl const&) (qdeclarativetypeloader.cpp:645)
      ==8972== by 0x42A3FB8: QDeclarativeComponent::loadUrl(QUrl const&) (qdeclarativecomponent.cpp:536)
      ==8972== by 0x42A36C1: QDeclarativeComponent::QDeclarativeComponent(QDeclarativeEngine*, QUrl const&, QObject*) (qdeclarativecomponent.cpp:437)
      ==8972== by 0x807EF97: tst_qdeclarativeecmascript::aliasBindingsAssignCorrectly() (tst_qdeclarativeecmascript.cpp:2999)

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            chriadam Christopher Adams (closed Nokia identity) (Inactive)
            chriadam Christopher Adams (closed Nokia identity) (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes