From 0b7fdca640f020f9b9de53401cc2c29b36748cf7 Mon Sep 17 00:00:00 2001 From: Artem Dergachev Date: Tue, 25 Sep 2018 22:13:31 +0000 Subject: [PATCH] [analyzer] NFC: CallDescription: Improve array management. Combine the two constructor overrides into a single ArrayRef constructor to allow easier brace initializations and simplify how the respective field is used internally. Differential Revision: https://reviews.llvm.org/D51390 llvm-svn: 343037 --- .../StaticAnalyzer/Core/PathSensitive/CallEvent.h | 23 ++++++---------------- clang/lib/StaticAnalyzer/Core/CallEvent.cpp | 17 +++++++++------- 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h index f8b2cf7..4c50eaf 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h @@ -82,7 +82,7 @@ class CallDescription { mutable bool IsLookupDone = false; // The list of the qualified names used to identify the specified CallEvent, // e.g. "{a, b}" represent the qualified names, like "a::b". - std::vector QualifiedName; + std::vector QualifiedName; unsigned RequiredArgs; public: @@ -90,29 +90,18 @@ public: /// Constructs a CallDescription object. /// - /// @param QualifiedName The list of the qualified names of the function that - /// will be matched. It does not require the user to provide the full list of - /// the qualified name. The more details provided, the more accurate the - /// matching. + /// @param QualifiedName The list of the name qualifiers of the function that + /// will be matched. The user is allowed to skip any of the qualifiers. + /// For example, {"std", "basic_string", "c_str"} would match both + /// std::basic_string<...>::c_str() and std::__1::basic_string<...>::c_str(). /// /// @param RequiredArgs The number of arguments that is expected to match a /// call. Omit this parameter to match every occurrence of call with a given /// name regardless the number of arguments. - CallDescription(std::vector QualifiedName, + CallDescription(ArrayRef QualifiedName, unsigned RequiredArgs = NoArgRequirement) : QualifiedName(QualifiedName), RequiredArgs(RequiredArgs) {} - /// Constructs a CallDescription object. - /// - /// @param FuncName The name of the function that will be matched. - /// - /// @param RequiredArgs The number of arguments that is expected to match a - /// call. Omit this parameter to match every occurrence of call with a given - /// name regardless the number of arguments. - CallDescription(StringRef FuncName, unsigned RequiredArgs = NoArgRequirement) - : CallDescription(std::vector({FuncName}), NoArgRequirement) { - } - /// Get the name of the function that this object matches. StringRef getFunctionName() const { return QualifiedName.back(); } }; diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp index 3ba68d4..7b6a8d4 100644 --- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp +++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp @@ -371,23 +371,26 @@ bool CallEvent::isCalled(const CallDescription &CD) const { // accuracy. if (CD.QualifiedName.size() > 1 && D) { const DeclContext *Ctx = D->getDeclContext(); - std::vector QualifiedName = CD.QualifiedName; - QualifiedName.pop_back(); + // See if we'll be able to match them all. + size_t NumUnmatched = CD.QualifiedName.size() - 1; for (; Ctx && isa(Ctx); Ctx = Ctx->getParent()) { + if (NumUnmatched == 0) + break; + if (const auto *ND = dyn_cast(Ctx)) { - if (!QualifiedName.empty() && ND->getName() == QualifiedName.back()) - QualifiedName.pop_back(); + if (ND->getName() == CD.QualifiedName[NumUnmatched - 1]) + --NumUnmatched; continue; } if (const auto *RD = dyn_cast(Ctx)) { - if (!QualifiedName.empty() && RD->getName() == QualifiedName.back()) - QualifiedName.pop_back(); + if (RD->getName() == CD.QualifiedName[NumUnmatched - 1]) + --NumUnmatched; continue; } } - if (!QualifiedName.empty()) + if (NumUnmatched > 0) return false; } -- 2.7.4