diff options
author | Marcus Tillmanns <[email protected]> | 2025-10-13 11:12:52 +0200 |
---|---|---|
committer | Marcus Tillmanns <[email protected]> | 2025-10-13 10:06:05 +0000 |
commit | d3b1008e864e011b386e1d96869de8fcc33e7251 (patch) | |
tree | 8254a2f92e10ee119def6b72bbaf9df5c6931378 | |
parent | 9d8362f481e5f541b81257dbbb4d34d8a1d227e0 (diff) |
QMake: Fix crash during destruction
During destruction of QmakeBuildConfiguration the connection from
BuildSystem::parsingFinished to QmakeBuildConfiguration::updateProblemLabel
might still be triggered. But due to the QmakeBuildConfiguration being already
partially destructed this leads to a crash.
From Sentry Issue:
https://the-qt-company-00.sentry.io/share/issue/710530f3be614a5ab0f1b35f04a21220/
Change-Id: I545ff38b990e642696dbce997a4ca77c6842b99c
Reviewed-by: Christian Kandeler <[email protected]>
-rw-r--r-- | src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp | 9 | ||||
-rw-r--r-- | src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h | 3 | ||||
-rw-r--r-- | src/plugins/qmakeprojectmanager/qmakestep.cpp | 1 |
3 files changed, 12 insertions, 1 deletions
diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp index c5731d6c2f3..4b3e7054042 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp @@ -150,7 +150,7 @@ QmakeBuildConfiguration::QmakeBuildConfiguration(Target *target, Id id) this, &QmakeBuildConfiguration::updateProblemLabel); connect(&settings(), &AspectContainer::changed, this, &QmakeBuildConfiguration::updateProblemLabel); - connect(buildSystem(), &BuildSystem::parsingFinished, + m_bsParsingFinishedConnection = connect(buildSystem(), &BuildSystem::parsingFinished, this, &QmakeBuildConfiguration::updateProblemLabel); connect(this, &BuildConfiguration::kitChanged, this, &QmakeBuildConfiguration::updateProblemLabel); @@ -182,6 +182,13 @@ QmakeBuildConfiguration::QmakeBuildConfiguration(Target *target, Id id) runSystemFunctions.setDefaultValue(2); } +QmakeBuildConfiguration::~QmakeBuildConfiguration() +{ + // BuildSystem might send signals during destruction before this QObject + // had a chance to disconnect from it. + disconnect(m_bsParsingFinishedConnection); +} + void QmakeBuildConfiguration::toMap(Store &map) const { BuildConfiguration::toMap(map); diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h index 4c6b2b40ab4..bc1ac3b5b43 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h @@ -29,6 +29,7 @@ class QMAKEPROJECTMANAGER_EXPORT QmakeBuildConfiguration : public ProjectExplore public: QmakeBuildConfiguration(ProjectExplorer::Target *target, Utils::Id id); + ~QmakeBuildConfiguration(); void setSubNodeBuild(QmakeProFileNode *node); QmakeProFileNode *subNodeBuild() const; @@ -136,6 +137,8 @@ private: QtSupport::QtVersion::QmakeBuildConfigs m_qmakeBuildConfiguration; QmakeProFileNode *m_subNodeBuild = nullptr; ProjectExplorer::FileNode *m_fileNodeBuild = nullptr; + + QMetaObject::Connection m_bsParsingFinishedConnection; }; class QMAKEPROJECTMANAGER_EXPORT QmakeBuildConfigurationFactory : public ProjectExplorer::BuildConfigurationFactory diff --git a/src/plugins/qmakeprojectmanager/qmakestep.cpp b/src/plugins/qmakeprojectmanager/qmakestep.cpp index a01bc5d4a18..d406d74dedd 100644 --- a/src/plugins/qmakeprojectmanager/qmakestep.cpp +++ b/src/plugins/qmakeprojectmanager/qmakestep.cpp @@ -112,6 +112,7 @@ QString QMakeStep::allArguments(const QtVersion *v, ArgumentFlags flags) const { QTC_ASSERT(v, return QString()); QmakeBuildConfiguration *bc = qmakeBuildConfiguration(); + QTC_ASSERT(bc, return {}); QStringList arguments; if (bc->subNodeBuild()) arguments << bc->subNodeBuild()->filePath().nativePath(); |