From 0e12ebfd3ef9ad5d894466c6e4910ac5e6041034 Mon Sep 17 00:00:00 2001
From: Anna Zaks <ganna@apple.com>
Date: Wed, 16 Nov 2011 19:57:55 +0000
Subject: [PATCH] [analyzer] Factor getCalleeName to the checker context. many
 checkers are trying to get a name of the callee when visiting a CallExpr, so
 provide a convenience API.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144820 91177308-0d34-0410-b5e6-96231b3b80d8
---
 .../Core/PathSensitive/CheckerContext.h           | 15 +++++++++++++++
 .../Checkers/MacOSKeychainAPIChecker.cpp          | 11 +----------
 2 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h b/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
index 2ef306d7b1b..d5eb95193ee 100644
--- a/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
+++ b/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
@@ -142,6 +142,21 @@ public:
     Eng.getBugReporter().EmitReport(R);
   }
 
+  /// \brief Get the name of the called function (path-sensitive).
+  StringRef getCalleeName(const CallExpr *CE) {
+    const ProgramState *State = getState();
+    const Expr *Callee = CE->getCallee();
+    SVal L = State->getSVal(Callee);
+
+    const FunctionDecl *funDecl = L.getAsFunctionDecl();
+    if (!funDecl)
+      return StringRef();
+    IdentifierInfo *funI = funDecl->getIdentifier();
+    if (!funI)
+      return StringRef();
+    return funI->getName();
+  }
+
 private:
   ExplodedNode *addTransitionImpl(const ProgramState *State,
                                  bool MarkAsSink,
diff --git a/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp b/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
index 6dc51a4aceb..c9de38c4a09 100644
--- a/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
+++ b/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
@@ -440,16 +440,7 @@ void MacOSKeychainAPIChecker::checkPreStmt(const CallExpr *CE,
 void MacOSKeychainAPIChecker::checkPostStmt(const CallExpr *CE,
                                             CheckerContext &C) const {
   const ProgramState *State = C.getState();
-  const Expr *Callee = CE->getCallee();
-  SVal L = State->getSVal(Callee);
-
-  const FunctionDecl *funDecl = L.getAsFunctionDecl();
-  if (!funDecl)
-    return;
-  IdentifierInfo *funI = funDecl->getIdentifier();
-  if (!funI)
-    return;
-  StringRef funName = funI->getName();
+  StringRef funName = C.getCalleeName(CE);
 
   // If a value has been allocated, add it to the set for tracking.
   unsigned idx = getTrackedFunctionIndex(funName, true);
-- 
GitLab