[cfe-commits] r148516 - in /cfe/trunk: include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h lib/StaticAnalyzer/Core/CheckerContext.cpp

Anna Zaks ganna at apple.com
Thu Jan 19 16:11:12 PST 2012


Author: zaks
Date: Thu Jan 19 18:11:12 2012
New Revision: 148516

URL: http://llvm.org/viewvc/llvm-project?rev=148516&view=rev
Log:
[analyzer] Add a utility method that allows to find the macro name used
at the given location. 

This could be useful when checkers' logic depends on whether a function
is called with a given macro argument.

Modified:
    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
    cfe/trunk/lib/StaticAnalyzer/Core/CheckerContext.cpp

Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h?rev=148516&r1=148515&r2=148516&view=diff
==============================================================================
--- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h (original)
+++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h Thu Jan 19 18:11:12 2012
@@ -66,7 +66,11 @@
   ASTContext &getASTContext() {
     return Eng.getContext();
   }
-  
+
+  const LangOptions &getLangOptions() const {
+    return Eng.getContext().getLangOptions();
+  }
+
   const LocationContext *getLocationContext() const {
     return Pred->getLocationContext();
   }
@@ -161,6 +165,17 @@
   /// function with the given name.
   bool isCLibraryFunction(const FunctionDecl *FD, StringRef Name);
 
+  /// \brief Depending on wither the location corresponds to a macro, return 
+  /// either the macro name or the token spelling.
+  ///
+  /// This could be useful when checkers' logic depends on whether a function
+  /// is called with a given macro argument. For example:
+  ///   s = socket(AF_INET,..)
+  /// If AF_INET is a macro, the result should be treated as a source of taint.
+  ///
+  /// \sa clang::Lexer::getSpelling(), clang::Lexer::getImmediateMacroName().
+  StringRef getMacroNameOrSpelling(SourceLocation &Loc);
+
 private:
   ExplodedNode *addTransitionImpl(const ProgramState *State,
                                  bool MarkAsSink,

Modified: cfe/trunk/lib/StaticAnalyzer/Core/CheckerContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/CheckerContext.cpp?rev=148516&r1=148515&r2=148516&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/CheckerContext.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/CheckerContext.cpp Thu Jan 19 18:11:12 2012
@@ -14,6 +14,7 @@
 
 #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
 #include "clang/Basic/Builtins.h"
+#include "clang/Lex/Lexer.h"
 
 using namespace clang;
 using namespace ento;
@@ -53,3 +54,15 @@
 
   return false;
 }
+
+StringRef CheckerContext::getMacroNameOrSpelling(SourceLocation &Loc) {
+  if (!Loc.isMacroID()) {
+    SmallVector<char, 16> buf;
+    return Lexer::getSpelling(Loc, buf, getSourceManager(), getLangOptions());
+  } else {
+    return Lexer::getImmediateMacroName(Loc, getSourceManager(),
+                                             getLangOptions());
+  }
+  return StringRef();
+}
+





More information about the cfe-commits mailing list