1 //== TaintTesterChecker.cpp ----------------------------------- -*- C++ -*--=// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This checker can be used for testing how taint data is propagated. 10 // 11 //===----------------------------------------------------------------------===// 12 #include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h" 13 #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" 14 #include "clang/StaticAnalyzer/Core/Checker.h" 15 #include "clang/StaticAnalyzer/Core/CheckerManager.h" 16 #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" 17 18 using namespace clang; 19 using namespace ento; 20 21 namespace { 22 class TaintTesterChecker : public Checker< check::PostStmt<Expr> > { 23 24 mutable std::unique_ptr<BugType> BT; 25 void initBugType() const; 26 27 /// Given a pointer argument, get the symbol of the value it contains 28 /// (points to). 29 SymbolRef getPointedToSymbol(CheckerContext &C, 30 const Expr* Arg, 31 bool IssueWarning = true) const; 32 33 public: 34 void checkPostStmt(const Expr *E, CheckerContext &C) const; 35 }; 36 } 37 38 inline void TaintTesterChecker::initBugType() const { 39 if (!BT) 40 BT.reset(new BugType(this, "Tainted data", "General")); 41 } 42 43 void TaintTesterChecker::checkPostStmt(const Expr *E, 44 CheckerContext &C) const { 45 ProgramStateRef State = C.getState(); 46 if (!State) 47 return; 48 49 if (State->isTainted(E, C.getLocationContext())) { 50 if (ExplodedNode *N = C.generateNonFatalErrorNode()) { 51 initBugType(); 52 auto report = llvm::make_unique<BugReport>(*BT, "tainted",N); 53 report->addRange(E->getSourceRange()); 54 C.emitReport(std::move(report)); 55 } 56 } 57 } 58 59 void ento::registerTaintTesterChecker(CheckerManager &mgr) { 60 mgr.registerChecker<TaintTesterChecker>(); 61 } 62 63 bool ento::shouldRegisterTaintTesterChecker(const LangOptions &LO) { 64 return true; 65 } 66