diff options
Diffstat (limited to 'lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp')
| -rw-r--r-- | lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp | 15 | 
1 files changed, 12 insertions, 3 deletions
diff --git a/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp b/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp index 135b81dda4ac..afb862cd6c9a 100644 --- a/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp @@ -273,7 +273,7 @@ GenericTaintChecker::TaintPropagationRule::getTaintPropagationRule(    // Skipping the following functions, since they might be used for cleansing    // or smart memory copy: -  // - memccpy - copying untill hitting a special character. +  // - memccpy - copying until hitting a special character.    return TaintPropagationRule();  } @@ -299,6 +299,9 @@ void GenericTaintChecker::addSourcesPre(const CallExpr *CE,                                          CheckerContext &C) const {    ProgramStateRef State = 0;    const FunctionDecl *FDecl = C.getCalleeDecl(CE); +  if (!FDecl || FDecl->getKind() != Decl::Function) +    return; +    StringRef Name = C.getCalleeName(FDecl);    if (Name.empty())      return; @@ -372,7 +375,11 @@ void GenericTaintChecker::addSourcesPost(const CallExpr *CE,                                           CheckerContext &C) const {    // Define the attack surface.    // Set the evaluation function by switching on the callee name. -  StringRef Name = C.getCalleeName(CE); +  const FunctionDecl *FDecl = C.getCalleeDecl(CE); +  if (!FDecl || FDecl->getKind() != Decl::Function) +    return; + +  StringRef Name = C.getCalleeName(FDecl);    if (Name.empty())      return;    FnCheck evalFunction = llvm::StringSwitch<FnCheck>(Name) @@ -406,6 +413,9 @@ bool GenericTaintChecker::checkPre(const CallExpr *CE, CheckerContext &C) const{      return true;    const FunctionDecl *FDecl = C.getCalleeDecl(CE); +  if (!FDecl || FDecl->getKind() != Decl::Function) +    return false; +    StringRef Name = C.getCalleeName(FDecl);    if (Name.empty())      return false; @@ -549,7 +559,6 @@ ProgramStateRef GenericTaintChecker::postScanf(const CallExpr *CE,    if (CE->getNumArgs() < 2)      return State; -  SVal x = State->getSVal(CE->getArg(1), C.getLocationContext());    // All arguments except for the very first one should get taint.    for (unsigned int i = 1; i < CE->getNumArgs(); ++i) {      // The arguments are pointer arguments. The data they are pointing at is  | 
