From 18537a5594a3bc6d999b6876a187acee9cfa7789 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 9 May 2017 12:19:13 +0200 Subject: [PATCH] ProjectNodes: Sprinkle QTC_ASSERT over code looking at parentFolderNode Not checking the parentFolderNode triggered a crash elsewhere already, so double check other uses of parentFolderNode and use QTC_ASSERT to make sure no nullptr is going to be accessed. This is necessary now that we have a forest of project trees and no longer have a sessionnode anymore. Change-Id: Ibc380c2ec9b12b983e709d2eeb03a8b741fe1058 Reviewed-by: Tim Jenssen --- src/plugins/projectexplorer/projectexplorer.cpp | 1 + src/plugins/qmakeprojectmanager/qmakenodes.cpp | 6 ++++-- src/plugins/qmakeprojectmanager/qmakeproject.cpp | 1 + src/plugins/resourceeditor/resourceeditorplugin.cpp | 1 + src/plugins/resourceeditor/resourcenode.cpp | 5 +++-- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 0d47cffeb95..b26fdce807f 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -3323,6 +3323,7 @@ void ProjectExplorerPlugin::renameFile(Node *node, const QString &newFilePath) { const QString oldFilePath = node->filePath().toFileInfo().absoluteFilePath(); FolderNode *folderNode = node->parentFolderNode(); + QTC_ASSERT(folderNode, return); const QString projectFileName = folderNode->managingProject()->filePath().fileName(); if (oldFilePath == newFilePath) diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index 98c0cae52e9..007e47b0180 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -84,9 +84,11 @@ bool QmakePriFileNode::supportsAction(ProjectAction action, Node *node) const const FolderNode *folderNode = this; const QmakeProFileNode *proFileNode; - while (!(proFileNode = dynamic_cast(folderNode))) + while (!(proFileNode = dynamic_cast(folderNode))) { folderNode = folderNode->parentFolderNode(); - Q_ASSERT(proFileNode); + QTC_ASSERT(folderNode, return false); + } + QTC_ASSERT(proFileNode, return false); const QmakeProFile *pro = proFileNode->proFile(); switch (pro ? pro->projectType() : ProjectType::Invalid) { diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index abedb874033..c7ff2a2765f 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -611,6 +611,7 @@ QStringList QmakeProject::filesGeneratedFrom(const QString &input) const if (const FileNode *file = fileNodeOf(rootProjectNode(), FileName::fromString(input))) { const QmakeProFileNode *pro = static_cast(file->parentFolderNode()); + QTC_ASSERT(pro, return {}); if (const QmakeProFile *proFile = pro->proFile()) return Utils::transform(proFile->generatedFiles(FileName::fromString(pro->buildDir()), file->filePath(), file->fileType()), diff --git a/src/plugins/resourceeditor/resourceeditorplugin.cpp b/src/plugins/resourceeditor/resourceeditorplugin.cpp index 42a59226b73..75cce175429 100644 --- a/src/plugins/resourceeditor/resourceeditorplugin.cpp +++ b/src/plugins/resourceeditor/resourceeditorplugin.cpp @@ -287,6 +287,7 @@ void ResourceEditorPlugin::removeFileContextMenu() QTC_ASSERT(rfn, return); QString path = rfn->filePath().toString(); FolderNode *parent = rfn->parentFolderNode(); + QTC_ASSERT(parent, return); if (!parent->removeFiles(QStringList() << path)) QMessageBox::warning(Core::ICore::mainWindow(), tr("File Removal Failed"), diff --git a/src/plugins/resourceeditor/resourcenode.cpp b/src/plugins/resourceeditor/resourcenode.cpp index b8fbcc10cb2..20f67b2eecd 100644 --- a/src/plugins/resourceeditor/resourcenode.cpp +++ b/src/plugins/resourceeditor/resourcenode.cpp @@ -70,8 +70,9 @@ public: { if (type == TypePermissions) return true; - auto newNode = new ResourceTopLevelNode(m_node->filePath(), false, m_node->contents(), - m_node->parentFolderNode()); + FolderNode *parent = m_node->parentFolderNode(); + QTC_ASSERT(parent, return false); + auto newNode = new ResourceTopLevelNode(m_node->filePath(), false, m_node->contents(), parent); m_node->parentFolderNode()->replaceSubtree(m_node, newNode); return true; }