CheckerContext.cpp revision 84aac9acc7a73360a7553c46f8da72773adbdd17
1//== CheckerContext.cpp - Context info for path-sensitive checkers-----------=// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines CheckerContext that provides contextual info for 11// path-sensitive checkers. 12// 13//===----------------------------------------------------------------------===// 14 15#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" 16#include "clang/Basic/Builtins.h" 17#include "clang/Lex/Lexer.h" 18 19using namespace clang; 20using namespace ento; 21 22const FunctionDecl *CheckerContext::getCalleeDecl(const CallExpr *CE) const { 23 ProgramStateRef State = getState(); 24 const Expr *Callee = CE->getCallee(); 25 SVal L = State->getSVal(Callee, Pred->getLocationContext()); 26 return L.getAsFunctionDecl(); 27} 28 29StringRef CheckerContext::getCalleeName(const FunctionDecl *FunDecl) const { 30 if (!FunDecl) 31 return StringRef(); 32 IdentifierInfo *funI = FunDecl->getIdentifier(); 33 if (!funI) 34 return StringRef(); 35 return funI->getName(); 36} 37 38 39bool CheckerContext::isCLibraryFunction(const FunctionDecl *FD, 40 StringRef Name) { 41 return isCLibraryFunction(FD, Name, getASTContext()); 42} 43 44bool CheckerContext::isCLibraryFunction(const FunctionDecl *FD, 45 StringRef Name, ASTContext &Context) { 46 // To avoid false positives (Ex: finding user defined functions with 47 // similar names), only perform fuzzy name matching when it's a builtin. 48 // Using a string compare is slow, we might want to switch on BuiltinID here. 49 unsigned BId = FD->getBuiltinID(); 50 if (BId != 0) { 51 StringRef BName = Context.BuiltinInfo.GetName(BId); 52 if (BName.find(Name) != StringRef::npos) 53 return true; 54 } 55 56 const IdentifierInfo *II = FD->getIdentifier(); 57 // If this is a special C++ name without IdentifierInfo, it can't be a 58 // C library function. 59 if (!II) 60 return false; 61 62 StringRef FName = II->getName(); 63 if (FName.startswith("__inline")) 64 return (FName.find(Name) != StringRef::npos); 65 66 if (FD->isExternC() && FName.equals(Name)) 67 return true; 68 69 return false; 70} 71 72StringRef CheckerContext::getMacroNameOrSpelling(SourceLocation &Loc) { 73 if (Loc.isMacroID()) 74 return Lexer::getImmediateMacroName(Loc, getSourceManager(), 75 getLangOptions()); 76 SmallVector<char, 16> buf; 77 return Lexer::getSpelling(Loc, buf, getSourceManager(), getLangOptions()); 78} 79 80