Fix warnings about uninitialized variables

qtbase/src/corelib/kernel/qmetatype.cpp: In static member function ‘static void QMetaType::destroy(int, void*)’:
qtbase/src/corelib/kernel/qmetatype.cpp:2599:27: error: ‘info.QMetaType::m_destructor’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
     if (m_typedDestructor && !m_destructor)
         ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~
qtbase/src/corelib/kernel/qmetatype.cpp:1868:15: note: ‘info.QMetaType::m_destructor’ was declared here
     QMetaType info(type);
               ^~~~
qtbase/src/corelib/kernel/qmetatype.cpp:2600:26: error: ‘info.QMetaType::m_typedDestructor’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
         m_typedDestructor(m_typeId, data);
         ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~
qtbase/src/corelib/kernel/qmetatype.cpp:1868:15: note: ‘info.QMetaType::m_typedDestructor’ was declared here
     QMetaType info(type);
               ^~~~

The extended (not inlined) function may be called on a half
initialized invalid instance.

Change-Id: I26d677a8ad2bd0c5846233f06393e774d377936d
Reviewed-by: Liang Qi <liang.qi@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Jędrzej Nowacki 2019-01-04 13:48:56 +01:00 committed by Liang Qi
parent 45e4dfb449
commit ecdccce8e4
2 changed files with 17 additions and 0 deletions

View File

@ -2566,6 +2566,8 @@ void *QMetaType::createExtended(const void *copy) const
*/
void QMetaType::destroyExtended(void *data) const
{
if (m_typeId == QMetaType::UnknownType)
return;
if (Q_UNLIKELY(m_typedDestructor && !m_destructor))
m_typedDestructor(m_typeId, data);
else
@ -2582,6 +2584,8 @@ void QMetaType::destroyExtended(void *data) const
*/
void *QMetaType::constructExtended(void *where, const void *copy) const
{
if (m_typeId == QMetaType::UnknownType)
return nullptr;
if (m_typedConstructor && !m_constructor)
return m_typedConstructor(m_typeId, where, copy);
return nullptr;
@ -2596,6 +2600,8 @@ void *QMetaType::constructExtended(void *where, const void *copy) const
*/
void QMetaType::destructExtended(void *data) const
{
if (m_typeId == QMetaType::UnknownType)
return;
if (m_typedDestructor && !m_destructor)
m_typedDestructor(m_typeId, data);
}

View File

@ -123,6 +123,7 @@ private slots:
void compareCustomType();
void compareCustomEqualOnlyType();
void customDebugStream();
void unknownType();
};
struct BaseGenericType
@ -2529,6 +2530,16 @@ void tst_QMetaType::customDebugStream()
qDebug() << v1;
}
void tst_QMetaType::unknownType()
{
QMetaType invalid(QMetaType::UnknownType);
QVERIFY(!invalid.create());
QVERIFY(!invalid.sizeOf());
QVERIFY(!invalid.metaObject());
int buffer = 0xBAD;
invalid.construct(&buffer);
QCOMPARE(buffer, 0xBAD);
}
// Compile-time test, it should be possible to register function pointer types
class Undefined;