diff options
author | Marc Mutz <marc.mutz@qt.io> | 2022-07-01 15:21:39 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@qt.io> | 2022-07-06 13:20:10 +0000 |
commit | 24106d1e1c818b358f919ce5cbff219b5a9f8b6a (patch) | |
tree | e726b6a9b1740eb4de76a8080019facd50c3d97a | |
parent | a9bf8ce4d074cce5f6924193d9f514d8dc903a6f (diff) |
Fix layering violation involving AbstractDeclarative
When trying an ubsan build of qtdatavis3d, I get:
abstract3dcontroller.cpp.o: undefined reference to `typeinfo for AbstractDeclarative'
Turns out that AbstractDeclarative is defined in DataVisualizationQml,
a separate library, which depends on DataVisualization.
It seems this worked because Abstract3DController only used inline
members of AbstractDeclarative, so a normal build doesn't need the
class exported, even though it's curious that inline isReady() calls
exported QQuickItem::isComponentLoaded() and the linker didn't
complain.
But an UBSan build requires the type_info, which isn't available,
because the class wasn't exported, and cannot be made available
because of the layering violation.
To fix, Extract Superclass AbstractDeclarativeInterface that provides
only the required isReady() function, but lives in DataVisualization,
and have the real AbstractDeclarative inherit it.
As a drive-by, make isReady() const.
Pick-to: 6.4 6.3 6.2
Fixes: QTBUG-104714
Change-Id: I0eb718746355f409a4105e2d53e79b7003fd8b22
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
6 files changed, 49 insertions, 3 deletions
diff --git a/src/datavisualization/CMakeLists.txt b/src/datavisualization/CMakeLists.txt index ca75d284..74b76cc3 100644 --- a/src/datavisualization/CMakeLists.txt +++ b/src/datavisualization/CMakeLists.txt @@ -34,6 +34,7 @@ qt_internal_add_module(DataVisualization data/scatteritemmodelhandler.cpp data/scatteritemmodelhandler_p.h data/scatterrenderitem.cpp data/scatterrenderitem_p.h data/surfaceitemmodelhandler.cpp data/surfaceitemmodelhandler_p.h + engine/abstractdeclarativeinterface.cpp engine/abstractdeclarativeinterface_p.h engine/abstract3dcontroller.cpp engine/abstract3dcontroller_p.h engine/abstract3drenderer.cpp engine/abstract3drenderer_p.h engine/axisrendercache.cpp engine/axisrendercache_p.h diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 279524bf..5081d37f 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -31,6 +31,7 @@ QT_FORWARD_DECLARE_CLASS(QOpenGLFramebufferObject) QT_BEGIN_NAMESPACE +class AbstractDeclarativeInterface; class AbstractDeclarative; class Abstract3DRenderer; class QAbstract3DSeries; @@ -201,7 +202,7 @@ protected: qreal m_margin; QMutex m_renderMutex; - AbstractDeclarative *m_qml = nullptr; + AbstractDeclarativeInterface *m_qml = nullptr; explicit Abstract3DController(QRect initialViewport, Q3DScene *scene, QObject *parent = 0); diff --git a/src/datavisualization/engine/abstractdeclarativeinterface.cpp b/src/datavisualization/engine/abstractdeclarativeinterface.cpp new file mode 100644 index 00000000..8a8b80fd --- /dev/null +++ b/src/datavisualization/engine/abstractdeclarativeinterface.cpp @@ -0,0 +1,11 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QtDataVisualization/private/abstractdeclarativeinterface_p.h> + +QT_BEGIN_NAMESPACE + +AbstractDeclarativeInterface::~AbstractDeclarativeInterface() + = default; + +QT_END_NAMESPACE diff --git a/src/datavisualization/engine/abstractdeclarativeinterface_p.h b/src/datavisualization/engine/abstractdeclarativeinterface_p.h new file mode 100644 index 00000000..8ea01bb1 --- /dev/null +++ b/src/datavisualization/engine/abstractdeclarativeinterface_p.h @@ -0,0 +1,31 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef ABSTRACTDECLARATIVEINTERFACE_P_H +#define ABSTRACTDECLARATIVEINTERFACE_P_H + +#include <QtDataVisualization/qdatavisualizationglobal.h> + +// +// W A R N I N G +// ------------- +// +// This file is not part of the QtDataVisualization API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +QT_BEGIN_NAMESPACE + +class Q_DATAVISUALIZATION_EXPORT AbstractDeclarativeInterface +{ +protected: + ~AbstractDeclarativeInterface(); +public: + virtual bool isReady() const = 0; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/datavisualizationqml/abstractdeclarative.cpp b/src/datavisualizationqml/abstractdeclarative.cpp index ca634ec2..5358050a 100644 --- a/src/datavisualizationqml/abstractdeclarative.cpp +++ b/src/datavisualizationqml/abstractdeclarative.cpp @@ -24,6 +24,7 @@ static QHash<AbstractDeclarative *, QQuickWindow *> graphWindowList; AbstractDeclarative::AbstractDeclarative(QQuickItem *parent) : QQuickItem(parent), + AbstractDeclarativeInterface(), m_controller(0), m_contextWindow(0), m_renderMode(RenderIndirect), diff --git a/src/datavisualizationqml/abstractdeclarative_p.h b/src/datavisualizationqml/abstractdeclarative_p.h index d5712bf4..f7b7e4cd 100644 --- a/src/datavisualizationqml/abstractdeclarative_p.h +++ b/src/datavisualizationqml/abstractdeclarative_p.h @@ -18,6 +18,7 @@ #include <private/datavisualizationglobal_p.h> #include <private/abstract3dcontroller_p.h> +#include <QtDataVisualization/private/abstractdeclarativeinterface_p.h> #include <QtQuick/QQuickItem> #include <QtCore/QPointer> @@ -29,7 +30,7 @@ class GLStateStore; QT_BEGIN_NAMESPACE -class AbstractDeclarative : public QQuickItem +class AbstractDeclarative : public QQuickItem, public AbstractDeclarativeInterface { Q_OBJECT Q_PROPERTY(SelectionFlags selectionMode READ selectionMode WRITE setSelectionMode NOTIFY selectionModeChanged) @@ -213,7 +214,7 @@ public: QMutex *mutex() { return &m_mutex; } - bool isReady() { return isComponentComplete(); } + bool isReady() const override { return isComponentComplete(); } public Q_SLOTS: virtual void handleAxisXChanged(QAbstract3DAxis *axis) = 0; |