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

Using enums in different class silently fails with uninitalized values

    XMLWordPrintable

Details

    Description

      The attached projects consists of two C++ classes that are exported to QML.
      One of the classes contains an enum, that is exported.
      Using that enum in a method of class A works, but fails in class B, with a valgrind error.
      Also, running the test under valgrind makes it suddenly work.

      Output when running normally:

      Calling Foo::foo with TypeA...
      Foo::foo() called with TypeA
      Foo::foo() called with TypeB
      Bar::bar() called with unknown type 1970654936 . This is a bug.
      Bar::bar() called with unknown type 1970655320 . This is a bug.

      Output when running under valgrind:

      valgrind --track-origins=yes ./enum
      ==21920== Memcheck, a memory error detector
      ==21920== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
      ==21920== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
      ==21920== Command: ./enum
      ==21920==
      Calling Foo::foo with TypeA...
      Foo::foo() called with TypeA
      Foo::foo() called with TypeB
      ==21920== Conditional jump or move depends on uninitialised value(s)
      ==21920== at 0x403A1D: Bar::bar(Foo::Type) (bar.cpp:7)
      ==21920== by 0x403D84: Bar::qt_metacall(QMetaObject::Call, int, void**) (moc_bar.cpp:72)
      ==21920== by 0x7D7766E: QMetaObject::metacall(QObject*, QMetaObject::Call, int, void**) (qmetaobject.cpp:237)
      ==21920== by 0x50BA7EA: QDeclarativeObjectMethodScriptClass::call(QScriptDeclarativeClass::Object*, QScriptContext*) (qdeclarativeobjectscriptclass.cpp:864)
      ==21920== by 0x56C4148: QScript::DeclarativeObjectDelegate::call(QTJSC::ExecState*, QTJSC::JSObject*, QTJSC::JSValue, QTJSC::ArgList const&) (qscriptdeclarativeobject.cpp:154)
      ==21920== by 0x55C71BF: QTJSC::NativeFuncWrapper::operator()(QTJSC::ExecState*, QTJSC::JSObject*, QTJSC::JSValue, QTJSC::ArgList const&) const (CallData.cpp:46)
      ==21920== by 0x559B841: cti_op_call_NotJSFunction (JITStubs.cpp:1771)
      ==21920== by 0xCC06C2A: ???
      ==21920== by 0x5547B97: QTJSC::JITCode::execute(QTJSC::RegisterFile*, QTJSC::ExecState*, QTJSC::JSGlobalData*, QTJSC::JSValue*) (JITCode.h:79)
      ==21920== by 0x5533E6C: QTJSC::Interpreter::execute(QTJSC::FunctionExecutable*, QTJSC::ExecState*, QTJSC::JSFunction*, QTJSC::JSObject*, QTJSC::ArgList const&, QTJSC::ScopeChainNode*, QTJSC::JSValue*) (Interpreter.cpp:716)
      ==21920== by 0x55EFC7F: QTJSC::JSFunction::call(QTJSC::ExecState*, QTJSC::JSValue, QTJSC::ArgList const&) (JSFunction.cpp:122)
      ==21920== by 0x55C7274: QTJSC::call(QTJSC::ExecState*, QTJSC::JSValue, QTJSC::CallType, QTJSC::CallData const&, QTJSC::JSValue, QTJSC::ArgList const&) (CallData.cpp:62)
      ==21920== by 0x56A86F4: QScriptValue::call(QScriptValue const&, QList<QScriptValue> const&) (qscriptvalue.cpp:1605)
      ==21920== by 0x5006340: QDeclarativeQtScriptExpression::eval(QObject*, bool*) (qdeclarativeexpression.cpp:479)
      ==21920== by 0x5006072: QDeclarativeQtScriptExpression::scriptValue(QObject*, bool*) (qdeclarativeexpression.cpp:434)
      ==21920== by 0x5006E2C: QDeclarativeExpressionPrivate::scriptValue(QObject*, bool*) (qdeclarativeexpression.cpp:614)
      ==21920== by 0x5006F69: QDeclarativeExpressionPrivate::value(QObject*, bool*) (qdeclarativeexpression.cpp:628)
      ==21920== by 0x504768A: QDeclarativeBoundSignal::qt_metacall(QMetaObject::Call, int, void**) (qdeclarativeboundsignal.cpp:177)
      ==21920== by 0x7D7766E: QMetaObject::metacall(QObject*, QMetaObject::Call, int, void**) (qmetaobject.cpp:237)
      ==21920== by 0x7D8C4C4: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (qobject.cpp:3280)
      ==21920== by 0x51251CA: QDeclarativeComponentAttached::completed() (moc_qdeclarativecomponent_p.cpp:86)
      ==21920== by 0x50131C0: QDeclarativeComponentPrivate::complete(QDeclarativeEnginePrivate*, QDeclarativeComponentPrivate::ConstructionState*) (qdeclarativecomponent.cpp:878)
      ==21920== by 0x501333F: QDeclarativeComponentPrivate::completeCreate() (qdeclarativecomponent.cpp:914)
      ==21920== by 0x50132F1: QDeclarativeComponent::completeCreate() (qdeclarativecomponent.cpp:907)
      ==21920== by 0x501261E: QDeclarativeComponent::create(QDeclarativeContext*) (qdeclarativecomponent.cpp:658)
      ==21920== by 0x4EEB486: QDeclarativeView::continueExecute() (qdeclarativeview.cpp:536)
      ==21920== by 0x4EEA484: QDeclarativeViewPrivate::execute() (qdeclarativeview.cpp:175)
      ==21920== by 0x4EEA985: QDeclarativeView::setSource(QUrl const&) (qdeclarativeview.cpp:324)
      ==21920== by 0x402288: main (main.cpp:20)
      ==21920== Uninitialised value was created by a heap allocation
      ==21920== at 0x4C267D0: operator new(unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
      ==21920== by 0x402DEB: void* qMetaTypeConstructHelper<Foo::Type>(Foo::Type const*) (qmetatype.h:141)
      ==21920== by 0x7D7F3E5: QMetaType::construct(int, void const*) (qmetatype.cpp:1236)
      ==21920== by 0x7D97F74: construct(QVariant::Private*, void const*) (qvariant.cpp:183)
      ==21920== by 0x6E75C02: construct(QVariant::Private*, void const*) (qguivariant.cpp:182)
      ==21920== by 0x7D9BB8C: QVariant::create(int, void const*) (qvariant.cpp:1391)
      ==21920== by 0x7D9BDFB: QVariant::QVariant(int, void const*) (qvariant.cpp:1670)
      ==21920== by 0x50B9A08: (anonymous namespace)::MetaCallArgument::fromScriptValue(int, QDeclarativeEngine*, QScriptValue const&) (qdeclarativeobjectscriptclass.cpp:766)
      ==21920== by 0x50BA701: QDeclarativeObjectMethodScriptClass::call(QScriptDeclarativeClass::Object*, QScriptContext*) (qdeclarativeobjectscriptclass.cpp:858)
      ==21920== by 0x56C4148: QScript::DeclarativeObjectDelegate::call(QTJSC::ExecState*, QTJSC::JSObject*, QTJSC::JSValue, QTJSC::ArgList const&) (qscriptdeclarativeobject.cpp:154)
      ==21920== by 0x55C71BF: QTJSC::NativeFuncWrapper::operator()(QTJSC::ExecState*, QTJSC::JSObject*, QTJSC::JSValue, QTJSC::ArgList const&) const (CallData.cpp:46)
      ==21920== by 0x559B841: cti_op_call_NotJSFunction (JITStubs.cpp:1771)
      ==21920== by 0xCC06C2A: ???
      ==21920== by 0x5547B97: QTJSC::JITCode::execute(QTJSC::RegisterFile*, QTJSC::ExecState*, QTJSC::JSGlobalData*, QTJSC::JSValue*) (JITCode.h:79)
      ==21920== by 0x5533E6C: QTJSC::Interpreter::execute(QTJSC::FunctionExecutable*, QTJSC::ExecState*, QTJSC::JSFunction*, QTJSC::JSObject*, QTJSC::ArgList const&, QTJSC::ScopeChainNode*, QTJSC::JSValue*) (Interpreter.cpp:716)
      ==21920== by 0x55EFC7F: QTJSC::JSFunction::call(QTJSC::ExecState*, QTJSC::JSValue, QTJSC::ArgList const&) (JSFunction.cpp:122)
      ==21920== by 0x55C7274: QTJSC::call(QTJSC::ExecState*, QTJSC::JSValue, QTJSC::CallType, QTJSC::CallData const&, QTJSC::JSValue, QTJSC::ArgList const&) (CallData.cpp:62)
      ==21920== by 0x56A86F4: QScriptValue::call(QScriptValue const&, QList<QScriptValue> const&) (qscriptvalue.cpp:1605)
      ==21920== by 0x5006340: QDeclarativeQtScriptExpression::eval(QObject*, bool*) (qdeclarativeexpression.cpp:479)
      ==21920== by 0x5006072: QDeclarativeQtScriptExpression::scriptValue(QObject*, bool*) (qdeclarativeexpression.cpp:434)
      ==21920== by 0x5006E2C: QDeclarativeExpressionPrivate::scriptValue(QObject*, bool*) (qdeclarativeexpression.cpp:614)
      ==21920== by 0x5006F69: QDeclarativeExpressionPrivate::value(QObject*, bool*) (qdeclarativeexpression.cpp:628)
      ==21920== by 0x504768A: QDeclarativeBoundSignal::qt_metacall(QMetaObject::Call, int, void**) (qdeclarativeboundsignal.cpp:177)
      ==21920== by 0x7D7766E: QMetaObject::metacall(QObject*, QMetaObject::Call, int, void**) (qmetaobject.cpp:237)
      ==21920== by 0x7D8C4C4: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (qobject.cpp:3280)
      ==21920== by 0x51251CA: QDeclarativeComponentAttached::completed() (moc_qdeclarativecomponent_p.cpp:86)
      ==21920== by 0x50131C0: QDeclarativeComponentPrivate::complete(QDeclarativeEnginePrivate*, QDeclarativeComponentPrivate::ConstructionState*) (qdeclarativecomponent.cpp:878)
      ==21920== by 0x501333F: QDeclarativeComponentPrivate::completeCreate() (qdeclarativecomponent.cpp:914)
      ==21920== by 0x50132F1: QDeclarativeComponent::completeCreate() (qdeclarativecomponent.cpp:907)
      ==21920== by 0x501261E: QDeclarativeComponent::create(QDeclarativeContext*) (qdeclarativecomponent.cpp:658)
      ==21920== by 0x4EEB486: QDeclarativeView::continueExecute() (qdeclarativeview.cpp:536)
      ==21920== by 0x4EEA484: QDeclarativeViewPrivate::execute() (qdeclarativeview.cpp:175)
      ==21920== by 0x4EEA985: QDeclarativeView::setSource(QUrl const&) (qdeclarativeview.cpp:324)
      ==21920== by 0x402288: main (main.cpp:20)
      ==21920==
      Bar::bar() called with TypeA
      Bar::bar() called with TypeA

      Expected outcome: Both function calls should work the same.

      Attachments

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

        Activity

          People

            aakenned Aaron Kennedy
            tmcguire Thomas McGuire
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes