diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2022-04-22 12:02:33 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2022-05-25 22:14:51 -0700 |
commit | cafc60c3bfb2d60360b9ca536430e829f2daae96 (patch) | |
tree | e2f09a5b16a816de877b49656bca631023ef637e | |
parent | 5680f42a979778455508b4bd076457a353becda5 (diff) |
Fix build with GCC12: apparently incorrect use-after-free warning
GCC12 is complaining about a use-after-free here, but I don't see it.
In member function ‘void QQmlContextData::release() const’,
inlined from ‘QQmlRefPointer<T>::~QQmlRefPointer() [with T = QQmlContextData]’ at ftw/qqmlrefcount_p.h:181:22,
inlined from ‘bool {anonymous}::contextHasNoExtensions(const QQmlRefPointer<QQmlContextData>&)’ at qqmlpropertycache.cpp:658:29,
inlined from ‘const QQmlPropertyData* QQmlPropertyCache::findProperty(QLinkedStringMultiHash<std::pair<int, QQmlPropertyData*> >::ConstIterator, const QQmlVMEMetaObject*, const QQmlRefPointer<QQmlContextData>&) const’ at qqmlpropertycache.cpp:683:56:
qqmlcontextdata_p.h:88:34: error: pointer used after ‘void operator delete(void*, std::size_t)’ [-Werror=use-after-free]
88 | void release() const { if (--m_refCount == 0) delete this; }
| ^~~~~~~~~~
In member function ‘void QQmlContextData::release() const’,
inlined from ‘QQmlRefPointer<T>::~QQmlRefPointer() [with T = QQmlContextData]’ at ftw/qqmlrefcount_p.h:181:22,
inlined from ‘bool {anonymous}::contextHasNoExtensions(const QQmlRefPointer<QQmlContextData>&)’ at qqmlpropertycache.cpp:658:51,
inlined from ‘const QQmlPropertyData* QQmlPropertyCache::findProperty(QLinkedStringMultiHash<std::pair<int, QQmlPropertyData*> >::ConstIterator, const QQmlVMEMetaObject*, const QQmlRefPointer<QQmlContextData>&) const’ at qqmlpropertycache.cpp:683:56:
qqmlcontextdata_p.h:88:58: note: call to ‘void operator delete(void*, std::size_t)’ here
88 | void release() const { if (--m_refCount == 0) delete this; }
| ^~~~
Pick-to: 6.2 6.3
Change-Id: If05aeeb7176e4f13af9afffd16e84d54de676bc2
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
-rw-r--r-- | src/qml/qml/qqmlpropertycache.cpp | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/qml/qml/qqmlpropertycache.cpp b/src/qml/qml/qqmlpropertycache.cpp index 96d5baaf98..d11ff378a7 100644 --- a/src/qml/qml/qqmlpropertycache.cpp +++ b/src/qml/qml/qqmlpropertycache.cpp @@ -659,7 +659,8 @@ inline bool contextHasNoExtensions(const QQmlRefPointer<QQmlContextData> &contex { // This context has no extension if its parent is the engine's rootContext, // which has children but no imports - return (!context->parent() || !context->parent()->imports()); + const QQmlRefPointer<QQmlContextData> parent = context->parent(); + return (!parent || !parent->imports()); } inline int maximumIndexForProperty(const QQmlPropertyData *prop, const int methodCount, const int signalCount, const int propertyCount) |