From c8c642dde0ab32a25942e970a8a332694f47c10c Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 8 Nov 2018 12:05:46 +0100 Subject: [PATCH] Clang: Fix crash when removing diagnostic config 1. Create some Qt Console Application from the wizard 2. Open Tools > Options > C++ > Code Model 2.1 Click "Manage..." and create a custom configuration "custom" and finish with OK. 2.2 Set "custom" as diagnostic config. 3. Analyze > "Clang-Tidy and Clazy..." 3.1 Use "Custom Settings" 3.2 Click "Manage..." and remove "custom" ==> Crash The crash happened because the code model used an invalid diagnostic config id. The invalid id came from the settings, which were not correctly upated. Fixes: QTCREATORBUG-21273 Change-Id: I5242f7c92e121eec8558fa7923139bb3d759c676 Reviewed-by: Ivan Donchevskii --- .../cpptools/clangdiagnosticconfigsselectionwidget.cpp | 3 +++ src/plugins/cpptools/cppcodemodelsettings.cpp | 5 +++++ src/plugins/cpptools/cppcodemodelsettings.h | 1 + 3 files changed, 9 insertions(+) diff --git a/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.cpp b/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.cpp index 70432047cf9..06d8478b508 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfigsselectionwidget.cpp @@ -126,6 +126,9 @@ void ClangDiagnosticConfigsSelectionWidget::connectToClangDiagnosticConfigsDialo = settings->clangCustomDiagnosticConfigs(); const ClangDiagnosticConfigs currentDiagnosticConfigs = widget->customConfigs(); if (oldDiagnosticConfigs != currentDiagnosticConfigs) { + const ClangDiagnosticConfigsModel configsModel(currentDiagnosticConfigs); + if (!configsModel.hasConfigWithId(settings->clangDiagnosticConfigId())) + settings->resetClangDiagnosticConfigId(); settings->setClangCustomDiagnosticConfigs(currentDiagnosticConfigs); settings->toSettings(Core::ICore::settings()); } diff --git a/src/plugins/cpptools/cppcodemodelsettings.cpp b/src/plugins/cpptools/cppcodemodelsettings.cpp index b7ebb1ddaa0..7a5c9877401 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.cpp +++ b/src/plugins/cpptools/cppcodemodelsettings.cpp @@ -195,6 +195,11 @@ void CppCodeModelSettings::setClangDiagnosticConfigId(const Core::Id &configId) m_clangDiagnosticConfigId = configId; } +void CppCodeModelSettings::resetClangDiagnosticConfigId() +{ + m_clangDiagnosticConfigId = initialClangDiagnosticConfigId(); +} + const ClangDiagnosticConfig CppCodeModelSettings::clangDiagnosticConfig() const { const ClangDiagnosticConfigsModel configsModel(m_clangCustomDiagnosticConfigs); diff --git a/src/plugins/cpptools/cppcodemodelsettings.h b/src/plugins/cpptools/cppcodemodelsettings.h index bc91fbd1b8e..92e52554c2e 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.h +++ b/src/plugins/cpptools/cppcodemodelsettings.h @@ -55,6 +55,7 @@ public: public: Core::Id clangDiagnosticConfigId() const; void setClangDiagnosticConfigId(const Core::Id &configId); + void resetClangDiagnosticConfigId(); const ClangDiagnosticConfig clangDiagnosticConfig() const; ClangDiagnosticConfigs clangCustomDiagnosticConfigs() const;