From 99a7f7ec00a218f17132af76427759be829039c1 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Mon, 3 Dec 2018 08:26:48 +0100 Subject: [PATCH] Clang: Fix/silence some coverty issues clangcompletionassistprocessor.cpp: 136 CID 1475671: Possible Control flow issues (DEADCODE) Execution cannot reach the expression "codeCompletion.completionKind != ClangBackEnd::CodeCompletion::SlotCompletionKind" inside this statement: "if (slotCompletion && codeC...". clangbackendcommunicator.cpp: 272 CID 1475649: Null pointer dereferences (NULL_RETURNS) Dereferencing a pointer that might be null "document" when calling "contents". (The dereference happens because this is a virtual function call.) clangutils.cpp: 335 CID 1475678: Error handling issues (CHECKED_RETURN) Calling "open" without checking return value (as is done elsewhere 144 out of 158 times). codecompletionsextractor.cpp: 48 CID 1475676: Uninitialized members (UNINIT_CTOR) Non-static class member field "currentCxCodeCompleteResult.CompletionString" is not initialized in this constructor nor in any functions that it calls. Change-Id: I4c8767ee6e824ba1c42d2f8914ad66dc95ac6717 Reviewed-by: Ivan Donchevskii Reviewed-by: Marco Bubke --- .../clangcodemodel/clangbackendcommunicator.cpp | 4 ++-- .../clangcodemodel/clangcompletionassistprocessor.cpp | 10 +++------- src/plugins/clangcodemodel/clangutils.cpp | 4 +++- .../clangbackend/source/codecompletionsextractor.h | 4 ++-- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/plugins/clangcodemodel/clangbackendcommunicator.cpp b/src/plugins/clangcodemodel/clangbackendcommunicator.cpp index 9cb4cb7016c..c777281897d 100644 --- a/src/plugins/clangcodemodel/clangbackendcommunicator.cpp +++ b/src/plugins/clangcodemodel/clangbackendcommunicator.cpp @@ -261,14 +261,14 @@ void BackendCommunicator::unsavedFilesUpdatedForUiHeaders() void BackendCommunicator::documentsChangedFromCppEditorDocument(const QString &filePath) { const CppTools::CppEditorDocumentHandle *document = ClangCodeModel::Utils::cppDocument(filePath); - + QTC_ASSERT(document, return); documentsChanged(filePath, document->contents(), document->revision()); } void BackendCommunicator::unsavedFielsUpdatedFromCppEditorDocument(const QString &filePath) { const CppTools::CppEditorDocumentHandle *document = ClangCodeModel::Utils::cppDocument(filePath); - + QTC_ASSERT(document, return); unsavedFilesUpdated(filePath, document->contents(), document->revision()); } diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp index 9e73dab3224..d00d488586f 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp @@ -122,8 +122,9 @@ static QList toAssistProposalItems( const CodeCompletions &completions, const ClangCompletionAssistInterface *interface) { - bool signalCompletion = false; // TODO - bool slotCompletion = false; // TODO + // TODO: Handle Qt4's SIGNAL/SLOT + // Possibly check for m_completionOperator == T_SIGNAL + // Possibly check for codeCompletion.completionKind == CodeCompletion::SignalCompletionKind QList items; items.reserve(completions.size()); @@ -131,11 +132,6 @@ static QList toAssistProposalItems( if (codeCompletion.text.isEmpty()) continue; // It's an OverloadCandidate which has text but no typedText. - if (signalCompletion && codeCompletion.completionKind != CodeCompletion::SignalCompletionKind) - continue; - if (slotCompletion && codeCompletion.completionKind != CodeCompletion::SlotCompletionKind) - continue; - const QString name = codeCompletion.completionKind == CodeCompletion::KeywordCompletionKind ? CompletionChunksToTextConverter::convertToName(codeCompletion.chunks) : codeCompletion.text.toString(); diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index 3a40ea67ac0..91770b95578 100644 --- a/src/plugins/clangcodemodel/clangutils.cpp +++ b/src/plugins/clangcodemodel/clangutils.cpp @@ -332,7 +332,9 @@ void generateCompilationDB(::Utils::FileName projectDir, CppTools::ProjectInfo p { QFile compileCommandsFile(projectDir.toString() + "/compile_commands.json"); - compileCommandsFile.open(QIODevice::WriteOnly | QIODevice::Truncate); + const bool fileOpened = compileCommandsFile.open(QIODevice::WriteOnly | QIODevice::Truncate); + if (!fileOpened) + return; compileCommandsFile.write("["); for (ProjectPart::Ptr projectPart : projectInfo.projectParts()) { const ::Utils::FileName buildDir = buildDirectory(*projectPart); diff --git a/src/tools/clangbackend/source/codecompletionsextractor.h b/src/tools/clangbackend/source/codecompletionsextractor.h index bba9aa6eb59..408badc7483 100644 --- a/src/tools/clangbackend/source/codecompletionsextractor.h +++ b/src/tools/clangbackend/source/codecompletionsextractor.h @@ -82,8 +82,8 @@ private: private: CodeCompletion currentCodeCompletion_; const UnsavedFile &unsavedFile; - CXCompletionResult currentCxCodeCompleteResult; - CXCodeCompleteResults *cxCodeCompleteResults; + CXCompletionResult currentCxCodeCompleteResult{CXCursor_UnexposedDecl, nullptr}; + CXCodeCompleteResults *cxCodeCompleteResults = nullptr; uint cxCodeCompleteResultIndex = 0; };