CheckerManager.h revision 3682f1ea9c7fddc7dcbc590891158ba40f7fca16
143dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis//===--- CheckerManager.h - Static Analyzer Checker Manager -----*- C++ -*-===// 243dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis// 343dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis// The LLVM Compiler Infrastructure 443dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis// 543dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 643dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis// License. See LICENSE.TXT for details. 743dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis// 843dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 943dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis// 1043dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis// Defines the Static Analyzer Checker Manager. 1143dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis// 1243dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 1343dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 1443dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis#ifndef LLVM_CLANG_SA_CORE_CHECKERMANAGER_H 1543dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis#define LLVM_CLANG_SA_CORE_CHECKERMANAGER_H 1643dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 172e471a3e476396be1ddca4ab8b9df721bcfc9437Argyrios Kyrtzidis#include "clang/Basic/LangOptions.h" 1843dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis#include "llvm/ADT/SmallVector.h" 199fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis#include "llvm/ADT/DenseMap.h" 20769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis#include "llvm/ADT/FoldingSet.h" 2135bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/Store.h" 22ebae6d0209e1ec3d5ea14f9e63bd0d740218ed14Anna Zaks#include "clang/Analysis/ProgramPoint.h" 239fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis#include <vector> 2443dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 2543dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidisnamespace clang { 269fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis class Decl; 27769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis class Stmt; 28e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis class CallExpr; 2943dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 3043dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidisnamespace ento { 31ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek class CheckerBase; 3243dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis class ExprEngine; 339fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis class AnalysisManager; 349fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis class BugReporter; 35769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis class CheckerContext; 3669f87c956b3ac2b80124fd9604af012e1061473aJordan Rose class SimpleCall; 37de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose class ObjCMethodCall; 38769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis class SVal; 39e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis class ExplodedNode; 40769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis class ExplodedNodeSet; 4130726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis class ExplodedGraph; 4218c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek class ProgramState; 43cd656cab3fa3dd4b0c974c6ae1c0e60880b18c22Anna Zaks class NodeBuilder; 44af498a28797c075c48d7e943df5f5a8e78ed8eb0Anna Zaks struct NodeBuilderContext; 45183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis class MemRegion; 46183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis class SymbolReaper; 47769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 484d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidistemplate <typename T> class CheckerFn; 494d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 5066c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zakstemplate <typename RET, typename P1, typename P2, typename P3, typename P4, 5166c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks typename P5> 5266c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaksclass CheckerFn<RET(P1, P2, P3, P4, P5)> { 5366c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks typedef RET (*Func)(void *, P1, P2, P3, P4, P5); 5466c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks Func Fn; 5566c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zakspublic: 5666c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks CheckerBase *Checker; 5766c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } 5866c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks RET operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const { 5966c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks return Fn(Checker, p1, p2, p3, p4, p5); 6066c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks } 6166c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks}; 6266c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks 6335bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenektemplate <typename RET, typename P1, typename P2, typename P3, typename P4> 6435bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenekclass CheckerFn<RET(P1, P2, P3, P4)> { 6535bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenek typedef RET (*Func)(void *, P1, P2, P3, P4); 6635bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenek Func Fn; 6735bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenekpublic: 68ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek CheckerBase *Checker; 69ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } 7035bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenek RET operator()(P1 p1, P2 p2, P3 p3, P4 p4) const { 7135bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenek return Fn(Checker, p1, p2, p3, p4); 7235bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenek } 7335bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenek}; 7435bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenek 754d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidistemplate <typename RET, typename P1, typename P2, typename P3> 764d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidisclass CheckerFn<RET(P1, P2, P3)> { 774d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef RET (*Func)(void *, P1, P2, P3); 78769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis Func Fn; 79769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidispublic: 80ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek CheckerBase *Checker; 81ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } 824d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis RET operator()(P1 p1, P2 p2, P3 p3) const { return Fn(Checker, p1, p2, p3); } 83769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis}; 84769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 854d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidistemplate <typename RET, typename P1, typename P2> 864d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidisclass CheckerFn<RET(P1, P2)> { 874d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef RET (*Func)(void *, P1, P2); 88769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis Func Fn; 89769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidispublic: 90ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek CheckerBase *Checker; 91ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } 924d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis RET operator()(P1 p1, P2 p2) const { return Fn(Checker, p1, p2); } 93769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis}; 94769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 954d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidistemplate <typename RET, typename P1> 964d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidisclass CheckerFn<RET(P1)> { 974d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef RET (*Func)(void *, P1); 98769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis Func Fn; 99769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidispublic: 100ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek CheckerBase *Checker; 101ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } 1024d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis RET operator()(P1 p1) const { return Fn(Checker, p1); } 103769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis}; 104769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 1054d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidistemplate <typename RET> 1064d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidisclass CheckerFn<RET()> { 1074d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef RET (*Func)(void *); 108769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis Func Fn; 109769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidispublic: 110ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek CheckerBase *Checker; 111ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } 1124d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis RET operator()() const { return Fn(Checker); } 113769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis}; 11443dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 11543dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidisclass CheckerManager { 1162e471a3e476396be1ddca4ab8b9df721bcfc9437Argyrios Kyrtzidis const LangOptions LangOpts; 1172e471a3e476396be1ddca4ab8b9df721bcfc9437Argyrios Kyrtzidis 11843dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidispublic: 1192e471a3e476396be1ddca4ab8b9df721bcfc9437Argyrios Kyrtzidis CheckerManager(const LangOptions &langOpts) : LangOpts(langOpts) { } 1209fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis ~CheckerManager(); 1219fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 122d655ab28fdf7c940d3f79f8f287954d7f76e0977Argyrios Kyrtzidis bool hasPathSensitiveCheckers() const; 123d655ab28fdf7c940d3f79f8f287954d7f76e0977Argyrios Kyrtzidis 124deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis void finishedCheckerRegistration(); 125deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 1264e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie const LangOptions &getLangOpts() const { return LangOpts; } 1272e471a3e476396be1ddca4ab8b9df721bcfc9437Argyrios Kyrtzidis 128ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek typedef CheckerBase *CheckerRef; 129ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek typedef const void *CheckerTag; 1304d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef CheckerFn<void ()> CheckerDtor; 1319fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 1329fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 1339fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis// registerChecker 1349fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 1359fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 1369fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis /// \brief Used to register checkers. 1373fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis /// 1383fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis /// \returns a pointer to the checker object. 1399fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis template <typename CHECKER> 1403fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis CHECKER *registerChecker() { 141deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis CheckerTag tag = getTag<CHECKER>(); 1423fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis CheckerRef &ref = CheckerTags[tag]; 1433fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis if (ref) 1443fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis return static_cast<CHECKER *>(ref); // already registered. 1453fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis 1469fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis CHECKER *checker = new CHECKER(); 147769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis CheckerDtors.push_back(CheckerDtor(checker, destruct<CHECKER>)); 1489fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis CHECKER::_register(checker, *this); 1493fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis ref = checker; 1503fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis return checker; 1519fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis } 15243dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 1539fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 154769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis// Functions for running checkers for AST traversing.. 1559fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 1569fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 1579fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis /// \brief Run checkers handling Decls. 1589fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis void runCheckersOnASTDecl(const Decl *D, AnalysisManager& mgr, 1599fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis BugReporter &BR); 1609fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 1619fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis /// \brief Run checkers handling Decls containing a Stmt body. 1629fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis void runCheckersOnASTBody(const Decl *D, AnalysisManager& mgr, 1639fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis BugReporter &BR); 1649fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 1659fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 166769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis// Functions for running checkers for path-sensitive checking. 167769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 168769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 169769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// \brief Run checkers for pre-visiting Stmts. 170c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// 171c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// The notification is performed for every explored CFGElement, which does 172c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// not include the control flow statements such as IfStmt. 173c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// 174c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// \sa runCheckersForBranchCondition, runCheckersForPostStmt 175769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void runCheckersForPreStmt(ExplodedNodeSet &Dst, 176cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis const ExplodedNodeSet &Src, 177769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis const Stmt *S, 178769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis ExprEngine &Eng) { 179769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis runCheckersForStmt(/*isPreVisit=*/true, Dst, Src, S, Eng); 180769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 181769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 182769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// \brief Run checkers for post-visiting Stmts. 183c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// 184c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// The notification is performed for every explored CFGElement, which does 185c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// not include the control flow statements such as IfStmt. 186c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// 187c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// \sa runCheckersForBranchCondition, runCheckersForPreStmt 188769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void runCheckersForPostStmt(ExplodedNodeSet &Dst, 189cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis const ExplodedNodeSet &Src, 190769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis const Stmt *S, 191514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek ExprEngine &Eng, 192514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek bool wasInlined = false) { 193514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek runCheckersForStmt(/*isPreVisit=*/false, Dst, Src, S, Eng, wasInlined); 194769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 195769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 196769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// \brief Run checkers for visiting Stmts. 197769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void runCheckersForStmt(bool isPreVisit, 198cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, 199514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek const Stmt *S, ExprEngine &Eng, 200514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek bool wasInlined = false); 201769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 202769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// \brief Run checkers for pre-visiting obj-c messages. 203769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void runCheckersForPreObjCMessage(ExplodedNodeSet &Dst, 204cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis const ExplodedNodeSet &Src, 205de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose const ObjCMethodCall &msg, 206769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis ExprEngine &Eng) { 207769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis runCheckersForObjCMessage(/*isPreVisit=*/true, Dst, Src, msg, Eng); 208769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 209769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 210769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// \brief Run checkers for post-visiting obj-c messages. 211769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void runCheckersForPostObjCMessage(ExplodedNodeSet &Dst, 212cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis const ExplodedNodeSet &Src, 213de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose const ObjCMethodCall &msg, 21457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose ExprEngine &Eng, 21557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose bool wasInlined = false) { 21657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose runCheckersForObjCMessage(/*isPreVisit=*/false, Dst, Src, msg, Eng, 21757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose wasInlined); 218769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 219769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 220769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// \brief Run checkers for visiting obj-c messages. 221769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void runCheckersForObjCMessage(bool isPreVisit, 222cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis ExplodedNodeSet &Dst, 223cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis const ExplodedNodeSet &Src, 22457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose const ObjCMethodCall &msg, ExprEngine &Eng, 22557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose bool wasInlined = false); 226769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 22796479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose /// \brief Run checkers for pre-visiting obj-c messages. 22896479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose void runCheckersForPreCall(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, 22996479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose const CallEvent &Call, ExprEngine &Eng) { 23096479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose runCheckersForCallEvent(/*isPreVisit=*/true, Dst, Src, Call, Eng); 23196479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose } 23296479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose 23396479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose /// \brief Run checkers for post-visiting obj-c messages. 23496479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose void runCheckersForPostCall(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, 23557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose const CallEvent &Call, ExprEngine &Eng, 23657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose bool wasInlined = false) { 23757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose runCheckersForCallEvent(/*isPreVisit=*/false, Dst, Src, Call, Eng, 23857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose wasInlined); 23996479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose } 24096479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose 24196479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose /// \brief Run checkers for visiting obj-c messages. 24296479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose void runCheckersForCallEvent(bool isPreVisit, ExplodedNodeSet &Dst, 24396479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose const ExplodedNodeSet &Src, 24457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose const CallEvent &Call, ExprEngine &Eng, 24557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose bool wasInlined = false); 24696479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose 247769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// \brief Run checkers for load/store of a location. 248769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void runCheckersForLocation(ExplodedNodeSet &Dst, 249cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis const ExplodedNodeSet &Src, 250bd613137499b1d4c3b63dccd0aa21f6add243f4fTed Kremenek SVal location, 251bd613137499b1d4c3b63dccd0aa21f6add243f4fTed Kremenek bool isLoad, 252bd613137499b1d4c3b63dccd0aa21f6add243f4fTed Kremenek const Stmt *NodeEx, 253bd613137499b1d4c3b63dccd0aa21f6add243f4fTed Kremenek const Stmt *BoundEx, 254769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis ExprEngine &Eng); 255769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 256312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis /// \brief Run checkers for binding of a value to a location. 257312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis void runCheckersForBind(ExplodedNodeSet &Dst, 258312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis const ExplodedNodeSet &Src, 259312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis SVal location, SVal val, 260ebae6d0209e1ec3d5ea14f9e63bd0d740218ed14Anna Zaks const Stmt *S, ExprEngine &Eng, 2613682f1ea9c7fddc7dcbc590891158ba40f7fca16Jordan Rose const ProgramPoint &PP); 262312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis 26330726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis /// \brief Run checkers for end of analysis. 26430726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis void runCheckersForEndAnalysis(ExplodedGraph &G, BugReporter &BR, 26530726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis ExprEngine &Eng); 26630726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis 267af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis /// \brief Run checkers for end of path. 268af498a28797c075c48d7e943df5f5a8e78ed8eb0Anna Zaks void runCheckersForEndPath(NodeBuilderContext &BC, 269af498a28797c075c48d7e943df5f5a8e78ed8eb0Anna Zaks ExplodedNodeSet &Dst, 270af498a28797c075c48d7e943df5f5a8e78ed8eb0Anna Zaks ExprEngine &Eng); 271af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis 272cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis /// \brief Run checkers for branch condition. 273cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis void runCheckersForBranchCondition(const Stmt *condition, 274f236b6503a4dbc44c1fccb8756bd57c9d0efdf05Anna Zaks ExplodedNodeSet &Dst, ExplodedNode *Pred, 2754e82d3cf6fd4c907265e3fa3aac0a835c35dc759Anna Zaks ExprEngine &Eng); 276cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis 277183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis /// \brief Run checkers for live symbols. 278c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// 279c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// Allows modifying SymbolReaper object. For example, checkers can explicitly 280c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// register symbols of interest as live. These symbols will not be marked 281c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// dead and removed. 28223111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek void runCheckersForLiveSymbols(ProgramStateRef state, 283183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis SymbolReaper &SymReaper); 284183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 285183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis /// \brief Run checkers for dead symbols. 286c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// 287c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// Notifies checkers when symbols become dead. For example, this allows 288c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// checkers to aggressively clean up/reduce the checker state and produce 289c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// precise diagnostics. 290183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis void runCheckersForDeadSymbols(ExplodedNodeSet &Dst, 291183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis const ExplodedNodeSet &Src, 292183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis SymbolReaper &SymReaper, const Stmt *S, 2930b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks ExprEngine &Eng, 2940b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks ProgramPoint::Kind K); 295183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 296183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis /// \brief True if at least one checker wants to check region changes. 29723111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek bool wantsRegionChangeUpdate(ProgramStateRef state); 298183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 299183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis /// \brief Run checkers for region changes. 300537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// 301537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// This corresponds to the check::RegionChanges callback. 302537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// \param state The current program state. 303537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// \param invalidated A set of all symbols potentially touched by the change. 304537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// \param ExplicitRegions The regions explicitly requested for invalidation. 305537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// For example, in the case of a function call, these would be arguments. 306537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// \param Regions The transitive closure of accessible regions, 307537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// i.e. all regions that may have been touched by this change. 3087c0d2a366d2810e711f9c6ced8cbd923b9fc823aJames Dennett /// \param Call The call expression wrapper if the regions are invalidated 3097c0d2a366d2810e711f9c6ced8cbd923b9fc823aJames Dennett /// by a call. 3107c0d2a366d2810e711f9c6ced8cbd923b9fc823aJames Dennett ProgramStateRef 31123111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek runCheckersForRegionChanges(ProgramStateRef state, 31235bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenek const StoreManager::InvalidatedSymbols *invalidated, 313537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose ArrayRef<const MemRegion *> ExplicitRegions, 31466c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks ArrayRef<const MemRegion *> Regions, 315740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const CallEvent *Call); 316183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 317312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis /// \brief Run checkers for handling assumptions on symbolic values. 31823111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek ProgramStateRef runCheckersForEvalAssume(ProgramStateRef state, 31923111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek SVal Cond, bool Assumption); 320312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis 321e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis /// \brief Run checkers for evaluating a call. 322645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /// 323645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /// Warning: Currently, the CallEvent MUST come from a CallExpr! 324e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis void runCheckersForEvalCall(ExplodedNodeSet &Dst, 325e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis const ExplodedNodeSet &Src, 326645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose const CallEvent &CE, ExprEngine &Eng); 3279be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek 3289be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek /// \brief Run checkers for the entire Translation Unit. 3299c378f705405d37f49795d5e915989de774fe11fTed Kremenek void runCheckersOnEndOfTranslationUnit(const TranslationUnitDecl *TU, 3309be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek AnalysisManager &mgr, 3319be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek BugReporter &BR); 332e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis 333dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// \brief Run checkers for debug-printing a ProgramState. 334dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// 335dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// Unlike most other callbacks, any checker can simply implement the virtual 336dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// method CheckerBase::printState if it has custom data to print. 337dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// \param Out The output stream 338dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// \param State The state being printed 339dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// \param NL The preferred representation of a newline. 340dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// \param Sep The preferred separator between different kinds of data. 34123111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek void runCheckersForPrintState(raw_ostream &Out, ProgramStateRef State, 342dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose const char *NL, const char *Sep); 343dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose 344769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 345769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis// Internal registration functions for AST traversing. 3469fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 3479fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 3489fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis // Functions used by the registration mechanism, checkers should not touch 3499fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis // these directly. 3509fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 3514d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef CheckerFn<void (const Decl *, AnalysisManager&, BugReporter &)> 352769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis CheckDeclFunc; 353769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 3549fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis typedef bool (*HandlesDeclFunc)(const Decl *D); 355769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void _registerForDecl(CheckDeclFunc checkfn, HandlesDeclFunc isForDeclFn); 3569fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 357769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void _registerForBody(CheckDeclFunc checkfn); 358769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 359769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 360769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis// Internal registration functions for path-sensitive checking. 361769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 362769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 3634d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef CheckerFn<void (const Stmt *, CheckerContext &)> CheckStmtFunc; 3644d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 365de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose typedef CheckerFn<void (const ObjCMethodCall &, CheckerContext &)> 3664d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis CheckObjCMessageFunc; 36796479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose 36896479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose typedef CheckerFn<void (const CallEvent &, CheckerContext &)> 36996479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose CheckCallFunc; 3704d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 371bd613137499b1d4c3b63dccd0aa21f6add243f4fTed Kremenek typedef CheckerFn<void (const SVal &location, bool isLoad, 372bd613137499b1d4c3b63dccd0aa21f6add243f4fTed Kremenek const Stmt *S, 373390909c89c98ab1807e15e033a72e975f866fb23Anna Zaks CheckerContext &)> 374769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis CheckLocationFunc; 3754d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 376390909c89c98ab1807e15e033a72e975f866fb23Anna Zaks typedef CheckerFn<void (const SVal &location, const SVal &val, 377390909c89c98ab1807e15e033a72e975f866fb23Anna Zaks const Stmt *S, CheckerContext &)> 378390909c89c98ab1807e15e033a72e975f866fb23Anna Zaks CheckBindFunc; 3794d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 3804d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef CheckerFn<void (ExplodedGraph &, BugReporter &, ExprEngine &)> 38130726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis CheckEndAnalysisFunc; 3824d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 383af498a28797c075c48d7e943df5f5a8e78ed8eb0Anna Zaks typedef CheckerFn<void (CheckerContext &)> 3844d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis CheckEndPathFunc; 3854d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 386f236b6503a4dbc44c1fccb8756bd57c9d0efdf05Anna Zaks typedef CheckerFn<void (const Stmt *, CheckerContext &)> 387cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis CheckBranchConditionFunc; 3884d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 3894d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef CheckerFn<void (SymbolReaper &, CheckerContext &)> 3904d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis CheckDeadSymbolsFunc; 3914d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 39223111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek typedef CheckerFn<void (ProgramStateRef,SymbolReaper &)> CheckLiveSymbolsFunc; 3934d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 39423111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek typedef CheckerFn<ProgramStateRef (ProgramStateRef, 39535bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenek const StoreManager::InvalidatedSymbols *symbols, 39666c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks ArrayRef<const MemRegion *> ExplicitRegions, 39766c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks ArrayRef<const MemRegion *> Regions, 398740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const CallEvent *Call)> 3994d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis CheckRegionChangesFunc; 4004d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 40123111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek typedef CheckerFn<bool (ProgramStateRef)> WantsRegionChangeUpdateFunc; 4024d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 40323111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek typedef CheckerFn<ProgramStateRef (ProgramStateRef, 40418c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek const SVal &cond, bool assumption)> 4054d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis EvalAssumeFunc; 4064d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 4074d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef CheckerFn<bool (const CallExpr *, CheckerContext &)> 4084d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis EvalCallFunc; 409769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 410dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks typedef CheckerFn<bool (const CallExpr *, ExprEngine &Eng, 411dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks ExplodedNode *Pred, 412dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks ExplodedNodeSet &Dst)> 413dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks InlineCallFunc; 414dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks 4159be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek typedef CheckerFn<void (const TranslationUnitDecl *, 4169be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek AnalysisManager&, BugReporter &)> 4179be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek CheckEndOfTranslationUnit; 4189be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek 419769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis typedef bool (*HandlesStmtFunc)(const Stmt *D); 420769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void _registerForPreStmt(CheckStmtFunc checkfn, 421769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis HandlesStmtFunc isForStmtFn); 422769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void _registerForPostStmt(CheckStmtFunc checkfn, 423769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis HandlesStmtFunc isForStmtFn); 424769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 425769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void _registerForPreObjCMessage(CheckObjCMessageFunc checkfn); 426769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void _registerForPostObjCMessage(CheckObjCMessageFunc checkfn); 427769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 42896479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose void _registerForPreCall(CheckCallFunc checkfn); 42996479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose void _registerForPostCall(CheckCallFunc checkfn); 43096479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose 431769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void _registerForLocation(CheckLocationFunc checkfn); 432769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 433312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis void _registerForBind(CheckBindFunc checkfn); 434312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis 43530726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis void _registerForEndAnalysis(CheckEndAnalysisFunc checkfn); 43630726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis 437af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis void _registerForEndPath(CheckEndPathFunc checkfn); 438af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis 439cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis void _registerForBranchCondition(CheckBranchConditionFunc checkfn); 440cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis 441183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis void _registerForLiveSymbols(CheckLiveSymbolsFunc checkfn); 442183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 443183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis void _registerForDeadSymbols(CheckDeadSymbolsFunc checkfn); 444183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 445183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis void _registerForRegionChanges(CheckRegionChangesFunc checkfn, 446183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis WantsRegionChangeUpdateFunc wantUpdateFn); 447183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 448312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis void _registerForEvalAssume(EvalAssumeFunc checkfn); 449312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis 450e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis void _registerForEvalCall(EvalCallFunc checkfn); 451e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis 452dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks void _registerForInlineCall(InlineCallFunc checkfn); 453dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks 4549be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek void _registerForEndOfTranslationUnit(CheckEndOfTranslationUnit checkfn); 4559be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek 456769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 457deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis// Internal registration functions for events. 458deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 459deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 460deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis typedef void *EventTag; 4614d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef CheckerFn<void (const void *event)> CheckEventFunc; 462deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 463deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis template <typename EVENT> 464deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis void _registerListenerForEvent(CheckEventFunc checkfn) { 465deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis EventInfo &info = Events[getTag<EVENT>()]; 466deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis info.Checkers.push_back(checkfn); 467deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis } 468deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 469deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis template <typename EVENT> 470deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis void _registerDispatcherForEvent() { 471deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis EventInfo &info = Events[getTag<EVENT>()]; 472deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis info.HasDispatcher = true; 473deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis } 474deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 475deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis template <typename EVENT> 476deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis void _dispatchEvent(const EVENT &event) const { 477deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis EventsTy::const_iterator I = Events.find(getTag<EVENT>()); 478deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis if (I == Events.end()) 479deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis return; 480deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis const EventInfo &info = I->second; 481deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis for (unsigned i = 0, e = info.Checkers.size(); i != e; ++i) 482deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis info.Checkers[i](&event); 483deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis } 484deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 485deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 486769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis// Implementation details. 487769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 48843dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 48943dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidisprivate: 4909fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis template <typename CHECKER> 4919fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis static void destruct(void *obj) { delete static_cast<CHECKER *>(obj); } 4929fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 493deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis template <typename T> 494deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis static void *getTag() { static int tag; return &tag; } 4953fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis 4963fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis llvm::DenseMap<CheckerTag, CheckerRef> CheckerTags; 4973fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis 498769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis std::vector<CheckerDtor> CheckerDtors; 499769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 5009fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis struct DeclCheckerInfo { 5019fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis CheckDeclFunc CheckFn; 5029fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis HandlesDeclFunc IsForDeclFn; 5039fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis }; 5049fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis std::vector<DeclCheckerInfo> DeclCheckers; 5059fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 506769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis std::vector<CheckDeclFunc> BodyCheckers; 5079fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 508686775deca8b8685eb90801495880e3abdd844c2Chris Lattner typedef SmallVector<CheckDeclFunc, 4> CachedDeclCheckers; 5099fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis typedef llvm::DenseMap<unsigned, CachedDeclCheckers> CachedDeclCheckersMapTy; 5109fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis CachedDeclCheckersMapTy CachedDeclCheckersMap; 511769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 512769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis struct StmtCheckerInfo { 513769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis CheckStmtFunc CheckFn; 514769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis HandlesStmtFunc IsForStmtFn; 515769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis bool IsPreVisit; 516769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis }; 517769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis std::vector<StmtCheckerInfo> StmtCheckers; 518769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 519769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis struct CachedStmtCheckersKey { 520769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis unsigned StmtKind; 521769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis bool IsPreVisit; 522769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 523769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis CachedStmtCheckersKey() : StmtKind(0), IsPreVisit(0) { } 524769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis CachedStmtCheckersKey(unsigned stmtKind, bool isPreVisit) 525769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis : StmtKind(stmtKind), IsPreVisit(isPreVisit) { } 526769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 527769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis static CachedStmtCheckersKey getSentinel() { 528fc26107870e0e450d863541179234bf9063a4da7Argyrios Kyrtzidis return CachedStmtCheckersKey(~0U, 0); 529769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 530769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis unsigned getHashValue() const { 531769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis llvm::FoldingSetNodeID ID; 532769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis ID.AddInteger(StmtKind); 533769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis ID.AddBoolean(IsPreVisit); 534769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis return ID.ComputeHash(); 535769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 536769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis bool operator==(const CachedStmtCheckersKey &RHS) const { 537769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis return StmtKind == RHS.StmtKind && IsPreVisit == RHS.IsPreVisit; 538769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 539769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis }; 540769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis friend struct llvm::DenseMapInfo<CachedStmtCheckersKey>; 541769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 542686775deca8b8685eb90801495880e3abdd844c2Chris Lattner typedef SmallVector<CheckStmtFunc, 4> CachedStmtCheckers; 543769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis typedef llvm::DenseMap<CachedStmtCheckersKey, CachedStmtCheckers> 544769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis CachedStmtCheckersMapTy; 545769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis CachedStmtCheckersMapTy CachedStmtCheckersMap; 546769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 547769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis CachedStmtCheckers *getCachedStmtCheckersFor(const Stmt *S, bool isPreVisit); 548769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 549769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis std::vector<CheckObjCMessageFunc> PreObjCMessageCheckers; 550769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis std::vector<CheckObjCMessageFunc> PostObjCMessageCheckers; 551769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 55296479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose std::vector<CheckCallFunc> PreCallCheckers; 55396479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose std::vector<CheckCallFunc> PostCallCheckers; 55496479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose 555769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis std::vector<CheckLocationFunc> LocationCheckers; 55630726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis 557312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis std::vector<CheckBindFunc> BindCheckers; 558312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis 55930726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis std::vector<CheckEndAnalysisFunc> EndAnalysisCheckers; 560e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis 561af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis std::vector<CheckEndPathFunc> EndPathCheckers; 562af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis 563cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis std::vector<CheckBranchConditionFunc> BranchConditionCheckers; 564cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis 565183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis std::vector<CheckLiveSymbolsFunc> LiveSymbolsCheckers; 566183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 567183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis std::vector<CheckDeadSymbolsFunc> DeadSymbolsCheckers; 568183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 569183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis struct RegionChangesCheckerInfo { 570183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis CheckRegionChangesFunc CheckFn; 571183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis WantsRegionChangeUpdateFunc WantUpdateFn; 572183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis }; 573183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis std::vector<RegionChangesCheckerInfo> RegionChangesCheckers; 574183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 575312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis std::vector<EvalAssumeFunc> EvalAssumeCheckers; 576312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis 577e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis std::vector<EvalCallFunc> EvalCallCheckers; 578deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 579dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks std::vector<InlineCallFunc> InlineCallCheckers; 580dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks 5819be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek std::vector<CheckEndOfTranslationUnit> EndOfTranslationUnitCheckers; 5829be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek 583deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis struct EventInfo { 584686775deca8b8685eb90801495880e3abdd844c2Chris Lattner SmallVector<CheckEventFunc, 4> Checkers; 585deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis bool HasDispatcher; 586deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis EventInfo() : HasDispatcher(false) { } 587deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis }; 588deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 589deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis typedef llvm::DenseMap<EventTag, EventInfo> EventsTy; 590deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis EventsTy Events; 59143dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis}; 59243dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 59343dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis} // end ento namespace 59443dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 59543dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis} // end clang namespace 59643dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 597769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidisnamespace llvm { 598769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// Define DenseMapInfo so that CachedStmtCheckersKey can be used as key 599769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// in DenseMap and DenseSets. 600769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis template <> 601769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis struct DenseMapInfo<clang::ento::CheckerManager::CachedStmtCheckersKey> { 602769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis static inline clang::ento::CheckerManager::CachedStmtCheckersKey 603769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis getEmptyKey() { 604769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis return clang::ento::CheckerManager::CachedStmtCheckersKey(); 605769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 606769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis static inline clang::ento::CheckerManager::CachedStmtCheckersKey 607769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis getTombstoneKey() { 608769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis return clang::ento::CheckerManager::CachedStmtCheckersKey::getSentinel(); 609769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 610769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 611769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis static unsigned 612769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis getHashValue(clang::ento::CheckerManager::CachedStmtCheckersKey S) { 613769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis return S.getHashValue(); 614769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 615769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 616769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis static bool isEqual(clang::ento::CheckerManager::CachedStmtCheckersKey LHS, 617769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis clang::ento::CheckerManager::CachedStmtCheckersKey RHS) { 618769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis return LHS == RHS; 619769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 620769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis }; 621769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis} // end namespace llvm 622769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 62343dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis#endif 624