diff options
author | Sami Rosendahl <ext-sami.1.rosendahl@nokia.com> | 2012-01-24 10:43:25 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-02-01 13:42:28 +0100 |
commit | f42f82f435d738339ad85c1380d1167338517247 (patch) | |
tree | 8d1c68a9e32aea78cd54538ea284b92c118e199e /src/xmlpatterns/data/qitem_p.h | |
parent | 2772027a20551d26364c2816e51fcabb20773e74 (diff) | |
download | qtxmlpatterns-f42f82f435d738339ad85c1380d1167338517247.tar.gz |
Fix access to uninitialized values in QtXmlPatterns
Fixes valgrind warning like below when executing tst_QXmlQuery::copyConstructor()
Conditional jump or move depends on uninitialised value(s)
at: QPatternist::NodeIndexStorage::operator!=(QPatternist::NodeIndexStorage const&) const (qabstractxmlnodemodel.cpp:1220)
by: QXmlItem::operator=(QXmlItem const&) (qabstractxmlnodemodel.cpp:1228)
Reason for the warning is that QPatternist::NodeIndexStorage::operator!=
accesses all fields of NodeIndexStorage, which are all not intialized in
every execution path of QXmlItem::QXmlItem(const QVariant &) and class
QPatternist::Item constructors.
Fixed by adding NodeIndexStorage::reset() function that resets all fields
and put a call to that function where NodeIndexStorage objects were
previously incompletely initialized. Note that unfortunately class
NodeIndexStorage cannot have a default constructor, because it is used as
a union field.
Change-Id: I758df57551ec49ce8c8b357794177b4e6c454d2f
Sanity-Review: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Dmitry Trofimov
Reviewed-by: Robin Burchell <robin+qt@viroteck.net>
Diffstat (limited to 'src/xmlpatterns/data/qitem_p.h')
-rw-r--r-- | src/xmlpatterns/data/qitem_p.h | 21 |
1 files changed, 4 insertions, 17 deletions
diff --git a/src/xmlpatterns/data/qitem_p.h b/src/xmlpatterns/data/qitem_p.h index 09cca91..020998c 100644 --- a/src/xmlpatterns/data/qitem_p.h +++ b/src/xmlpatterns/data/qitem_p.h @@ -207,14 +207,7 @@ namespace QPatternist */ inline Item() { - /* Note that this function should be equal to reset(). */ - - /* This is the area which atomicValue uses. Becauase we want as() - * to return null on null-constructed objects, we initialize it. */ - node.data = 0; - - /* This signals that we're not an atomic value. */ - node.model = 0; + reset(); } inline Item(const QXmlNodeModelIndex &n) : node(n.m_storage) @@ -231,6 +224,7 @@ namespace QPatternist inline Item(const AtomicValue::Ptr &a) { + reset(); if(a) { atomicValue = a.data(); @@ -239,14 +233,12 @@ namespace QPatternist /* Signal that we're housing an atomic value. */ node.model = reinterpret_cast<const QAbstractXmlNodeModel *>(~0); } - else - node.model = 0; /* Like the default constructor. */ } inline Item(const AtomicValue *const a) { /* Note, the implementation is a copy of the constructor above. */ - + reset(); if(a) { atomicValue = a; @@ -255,8 +247,6 @@ namespace QPatternist /* Signal that we're housing an atomic value. */ node.model = reinterpret_cast<const QAbstractXmlNodeModel *>(~0); } - else - node.model = 0; /* Like the default constructor. */ } inline ~Item() @@ -408,10 +398,7 @@ namespace QPatternist inline void reset() { - /* Note that this function should be equal to the default - * constructor. */ - node.model = 0; - node.data = 0; + node.reset(); } static inline Item fromPublic(const QXmlItem &i) |