From ecb98260cd345787c6071e6ec352b46104c39d86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20D=C3=B3czi?= Date: Mon, 7 Mar 2022 16:18:31 +0100 Subject: [PATCH 1/3] Add .empty() check in CppServiceHandler::getTags Fixes segfault --- plugins/cpp/service/src/cppservice.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/plugins/cpp/service/src/cppservice.cpp b/plugins/cpp/service/src/cppservice.cpp index 3031ecae9..e465f6ffe 100644 --- a/plugins/cpp/service/src/cppservice.cpp +++ b/plugins/cpp/service/src/cppservice.cpp @@ -1611,14 +1611,19 @@ CppServiceHandler::getTags(const std::vector& nodes_) tags[node.id].push_back(visibility); } - //--- Virtual Tag ---// + //--- Other Tags ---// FuncResult funcNodes = _db->query( FuncQuery::entityHash == defNode.entityHash); - const model::CppFunction& funcNode = *funcNodes.begin(); + if(!funcNodes.empty()) + { + const model::CppFunction& funcNode = *funcNodes.begin(); - for (const model::Tag& tag : funcNode.tags) - tags[node.id].push_back(model::tagToString(tag)); + for (const model::Tag& tag : funcNode.tags) + tags[node.id].push_back(model::tagToString(tag)); + } else + LOG(warning) << "Database query result was not expected to be empty. " + << __FILE__ << ", line #" << __LINE__; break; } From 88381b4e49e79f6b3e845a7a42960ae2672edb2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20D=C3=B3czi?= Date: Tue, 8 Mar 2022 01:26:11 +0100 Subject: [PATCH 2/3] Fix coding style --- plugins/cpp/service/src/cppservice.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/cpp/service/src/cppservice.cpp b/plugins/cpp/service/src/cppservice.cpp index e465f6ffe..5ca680aa6 100644 --- a/plugins/cpp/service/src/cppservice.cpp +++ b/plugins/cpp/service/src/cppservice.cpp @@ -1615,13 +1615,14 @@ CppServiceHandler::getTags(const std::vector& nodes_) FuncResult funcNodes = _db->query( FuncQuery::entityHash == defNode.entityHash); - if(!funcNodes.empty()) + if (!funcNodes.empty()) { const model::CppFunction& funcNode = *funcNodes.begin(); for (const model::Tag& tag : funcNode.tags) tags[node.id].push_back(model::tagToString(tag)); - } else + } + else LOG(warning) << "Database query result was not expected to be empty. " << __FILE__ << ", line #" << __LINE__; From b317b94389d4b80764a9318cc18b64292645279d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20D=C3=B3czi?= Date: Tue, 5 Apr 2022 21:31:44 +0200 Subject: [PATCH 3/3] Make CppServiceHandler's warnings more descriptive --- .../cpp/service/include/service/cppservice.h | 2 + plugins/cpp/service/src/cppservice.cpp | 107 +++++++++++++----- 2 files changed, 79 insertions(+), 30 deletions(-) diff --git a/plugins/cpp/service/include/service/cppservice.h b/plugins/cpp/service/include/service/cppservice.h index edfc3bbfc..853972881 100644 --- a/plugins/cpp/service/include/service/cppservice.h +++ b/plugins/cpp/service/include/service/cppservice.h @@ -383,6 +383,8 @@ class CppServiceHandler : virtual public LanguageServiceIf std::shared_ptr _datadir; const cc::webserver::ServerContext& _context; + + std::string toShortDiagnosticString(const model::CppAstNode& node) const; }; } diff --git a/plugins/cpp/service/src/cppservice.cpp b/plugins/cpp/service/src/cppservice.cpp index 5ca680aa6..4b8e8586d 100644 --- a/plugins/cpp/service/src/cppservice.cpp +++ b/plugins/cpp/service/src/cppservice.cpp @@ -289,8 +289,10 @@ void CppServiceHandler::getProperties( return_["Type"] = variable.qualifiedType; } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when querying properties " + "of C++ variable: " + << toShortDiagnosticString(node); break; } @@ -310,8 +312,10 @@ void CppServiceHandler::getProperties( return_["Signature"] = function.name; } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when querying properties " + "of C++ function: " + << toShortDiagnosticString(node); break; } @@ -334,8 +338,10 @@ void CppServiceHandler::getProperties( return_["Qualified name"] = type.qualifiedName; } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when querying properties " + "of C++ type: " + << toShortDiagnosticString(node); break; } @@ -353,8 +359,10 @@ void CppServiceHandler::getProperties( return_["Qualified name"] = type.qualifiedName; } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when querying properties " + "of C++ typedef: " + << toShortDiagnosticString(node); break; } @@ -373,8 +381,10 @@ void CppServiceHandler::getProperties( return_["Value"] = std::to_string(enumConst.value); } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when querying properties " + "of C++ enum constant: " + << toShortDiagnosticString(node); } } }); @@ -492,8 +502,10 @@ std::int32_t CppServiceHandler::getReferenceCount( TypeQuery::entityHash == function.typeHash).count; } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when counting return types " + "of C++ function: " + << toShortDiagnosticString(node); return 0; } @@ -526,8 +538,10 @@ std::int32_t CppServiceHandler::getReferenceCount( TypeQuery::entityHash == variable.typeHash).count; } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when counting types " + "of C++ variable: " + << toShortDiagnosticString(node); return 0; } @@ -774,8 +788,10 @@ void CppServiceHandler::getReferences( std::to_string(var.load()->astNodeId))); } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when querying parameters " + "of C++ function: " + << toShortDiagnosticString(node); break; } @@ -795,8 +811,10 @@ void CppServiceHandler::getReferences( std::to_string(var.load()->astNodeId))); } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when querying local variables " + "of C++ function: " + << toShortDiagnosticString(node); break; } @@ -822,8 +840,10 @@ void CppServiceHandler::getReferences( } } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when querying return type " + "of C++ function: " + << toShortDiagnosticString(node); break; } @@ -884,8 +904,10 @@ void CppServiceHandler::getReferences( } } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when querying type " + "of C++ variable: " + << toShortDiagnosticString(node); break; } @@ -983,8 +1005,10 @@ void CppServiceHandler::getReferences( nodes = std::vector(result.begin(), result.end()); } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when querying underlying type " + "of C++ typedef: " + << toShortDiagnosticString(node); break; } @@ -1009,8 +1033,10 @@ void CppServiceHandler::getReferences( }); } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when querying enum constants " + "of C++ enum: " + << toShortDiagnosticString(node); break; } @@ -1623,8 +1649,10 @@ CppServiceHandler::getTags(const std::vector& nodes_) tags[node.id].push_back(model::tagToString(tag)); } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when querying tags " + "of C++ function: " + << toShortDiagnosticString(node); break; } @@ -1656,8 +1684,10 @@ CppServiceHandler::getTags(const std::vector& nodes_) tags[node.id].push_back(model::tagToString(tag)); } else - LOG(warning) << "Database query result was not expected to be empty. " - << __FILE__ << ", line #" << __LINE__; + LOG(warning) + << "Unexpected empty result when querying tags " + "of C++ variable: " + << toShortDiagnosticString(node); break; } @@ -1704,6 +1734,23 @@ std::size_t CppServiceHandler::queryCallsCount( return _db->query_value(astCallsQuery(node)).count; } +inline std::string +CppServiceHandler::toShortDiagnosticString(const model::CppAstNode& node) const +{ + return std::string(node.astValue) + .append("\n AST node #").append(std::to_string(node.id)) + .append("\n in file ").append(node.location.file.load()->path) + .append(" (") + .append(std::to_string( + static_cast(node.location.range.start.line))).append(":") + .append(std::to_string( + static_cast(node.location.range.start.column))).append(" - ") + .append(std::to_string( + static_cast(node.location.range.end.line))).append(":") + .append(std::to_string( + static_cast(node.location.range.end.column))).append(")"); +} + } // language } // service } // cc