From 82b8ddc0420935ef2e4dae704a93f94e2e9d3dc2 Mon Sep 17 00:00:00 2001 From: wmayer Date: Mon, 13 Jun 2022 14:21:18 +0200 Subject: [PATCH] Fem: use WeakPtrT classes instead of raw pointers to avoid possible dangling pointers and to avoid undefined behaviour if a wrong static_cast is performed --- src/Mod/Fem/Gui/TaskPostBoxes.cpp | 11 ++++++----- src/Mod/Fem/Gui/TaskPostBoxes.h | 29 ++++++++++++++++++++--------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/Mod/Fem/Gui/TaskPostBoxes.cpp b/src/Mod/Fem/Gui/TaskPostBoxes.cpp index bc77191f97..fc2e2fcbe0 100644 --- a/src/Mod/Fem/Gui/TaskPostBoxes.cpp +++ b/src/Mod/Fem/Gui/TaskPostBoxes.cpp @@ -212,7 +212,8 @@ ViewProviderDataMarker::~ViewProviderDataMarker() // *************************************************************************** TaskDlgPost::TaskDlgPost(Gui::ViewProviderDocumentObject* view) - : TaskDialog(), m_view(view) + : TaskDialog() + , m_view(view) { assert(view); } @@ -289,10 +290,10 @@ void TaskDlgPost::modifyStandardButtons(QDialogButtonBox* box) { // *************************************************************************** // some task box methods TaskPostBox::TaskPostBox(Gui::ViewProviderDocumentObject* view, const QPixmap& icon, const QString& title, QWidget* parent) - : TaskBox(icon, title, true, parent) { - - m_view = view; - m_object = view->getObject(); + : TaskBox(icon, title, true, parent) + , m_object(view->getObject()) + , m_view(view) +{ } TaskPostBox::~TaskPostBox() { diff --git a/src/Mod/Fem/Gui/TaskPostBoxes.h b/src/Mod/Fem/Gui/TaskPostBoxes.h index 9c81376d2a..34e2e948c4 100644 --- a/src/Mod/Fem/Gui/TaskPostBoxes.h +++ b/src/Mod/Fem/Gui/TaskPostBoxes.h @@ -23,6 +23,8 @@ #ifndef GUI_TASKVIEW_TaskPostDisplay_H #define GUI_TASKVIEW_TaskPostDisplay_H +#include +#include #include #include #include @@ -143,12 +145,20 @@ public: virtual bool isGuiTaskOnly() {return false;} //return true if only gui properties are manipulated protected: - App::DocumentObject* getObject() {return m_object;} + App::DocumentObject* getObject() const { + return *m_object; + } template - T* getTypedObject() {return static_cast(m_object);} - Gui::ViewProviderDocumentObject* getView() {return m_view;} + T* getTypedObject() const { + return m_object.get(); + } + Gui::ViewProviderDocumentObject* getView() const { + return *m_view; + } template - T* getTypedView() {return static_cast(m_view);} + T* getTypedView() const { + return m_view.get(); + } bool autoApply(); void recompute(); @@ -156,8 +166,8 @@ protected: static void updateEnumerationList(App::PropertyEnumeration&, QComboBox* box); private: - App::DocumentObject* m_object; - Gui::ViewProviderDocumentObject* m_view; + App::DocumentObjectWeakPtrT m_object; + Gui::ViewProviderWeakPtrT m_view; }; @@ -171,8 +181,9 @@ public: ~TaskDlgPost(); void appendBox(TaskPostBox* box); - Gui::ViewProviderDocumentObject* getView() const - { return m_view; } + Gui::ViewProviderDocumentObject* getView() const { + return *m_view; + } public: /// is called the TaskView when the dialog is opened @@ -192,7 +203,7 @@ public: virtual QDialogButtonBox::StandardButtons getStandardButtons(void) const; protected: - Gui::ViewProviderDocumentObject* m_view; + Gui::ViewProviderWeakPtrT m_view; std::vector m_boxes; };