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 14176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_STATICANALYZER_CORE_CHECKERMANAGER_H 15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_STATICANALYZER_CORE_CHECKERMANAGER_H 1643dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 1730a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/Analysis/ProgramPoint.h" 182e471a3e476396be1ddca4ab8b9df721bcfc9437Argyrios Kyrtzidis#include "clang/Basic/LangOptions.h" 198dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" 20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/StaticAnalyzer/Core/PathSensitive/Store.h" 219fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis#include "llvm/ADT/DenseMap.h" 2230a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/ADT/SmallVector.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; 32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class CheckerRegistry; 3343dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis class ExprEngine; 349fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis class AnalysisManager; 359fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis class BugReporter; 36769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis class CheckerContext; 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 500e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate <typename RET, typename... Ps> 510e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesclass CheckerFn<RET(Ps...)> { 520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines typedef RET (*Func)(void *, Ps...); 5366c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks Func Fn; 5466c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zakspublic: 5566c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks CheckerBase *Checker; 5666c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } 570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines RET operator()(Ps... ps) const { 580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return Fn(Checker, ps...); 5966c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks } 6066c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks}; 6166c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks 62233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks/// \brief Describes the different reasons a pointer escapes 63233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks/// during analysis. 64233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaksenum PointerEscapeKind { 65233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks /// A pointer escapes due to binding its value to a location 66233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks /// that the analyzer cannot track. 67233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks PSK_EscapeOnBind, 68233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks 69233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks /// The pointer has been passed to a function call directly. 70233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks PSK_DirectEscapeOnCall, 71233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks 72233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks /// The pointer has been passed to a function indirectly. 73233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks /// For example, the pointer is accessible through an 74233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks /// argument to a function. 75233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks PSK_IndirectEscapeOnCall, 76233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks 77233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks /// The reason for pointer escape is unknown. For example, 78233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks /// a region containing this pointer is invalidated. 79233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks PSK_EscapeOther 80233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks}; 81233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks 82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// This wrapper is used to ensure that only StringRefs originating from the 83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CheckerRegistry are used as check names. We want to make sure all check 84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// name strings have a lifetime that keeps them alive at least until the path 85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// diagnostics have been processed. 86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass CheckName { 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef Name; 88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines friend class ::clang::ento::CheckerRegistry; 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines explicit CheckName(StringRef Name) : Name(Name) {} 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic: 92a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar CheckName() = default; 93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef getName() const { return Name; } 94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 96a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarenum class ObjCMessageVisitKind { 97a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar Pre, 98a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar Post, 99a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar MessageNil 100a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}; 101a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 10243dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidisclass CheckerManager { 1032e471a3e476396be1ddca4ab8b9df721bcfc9437Argyrios Kyrtzidis const LangOptions LangOpts; 1048dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek AnalyzerOptionsRef AOptions; 105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CheckName CurrentCheckName; 106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 10743dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidispublic: 1088dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek CheckerManager(const LangOptions &langOpts, 1098dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek AnalyzerOptionsRef AOptions) 1108dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek : LangOpts(langOpts), 1118dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek AOptions(AOptions) {} 1128dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek 1139fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis ~CheckerManager(); 1149fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void setCurrentCheckName(CheckName name) { CurrentCheckName = name; } 116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CheckName getCurrentCheckName() const { return CurrentCheckName; } 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 118d655ab28fdf7c940d3f79f8f287954d7f76e0977Argyrios Kyrtzidis bool hasPathSensitiveCheckers() const; 119d655ab28fdf7c940d3f79f8f287954d7f76e0977Argyrios Kyrtzidis 120deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis void finishedCheckerRegistration(); 121deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 1224e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie const LangOptions &getLangOpts() const { return LangOpts; } 1238dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek AnalyzerOptions &getAnalyzerOptions() { return *AOptions; } 1242e471a3e476396be1ddca4ab8b9df721bcfc9437Argyrios Kyrtzidis 125ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek typedef CheckerBase *CheckerRef; 126ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek typedef const void *CheckerTag; 1274d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef CheckerFn<void ()> CheckerDtor; 1289fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 1299fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 1309fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis// registerChecker 1319fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 1329fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 1339fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis /// \brief Used to register checkers. 1343fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis /// 1353fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis /// \returns a pointer to the checker object. 1369fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis template <typename CHECKER> 1373fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis CHECKER *registerChecker() { 138deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis CheckerTag tag = getTag<CHECKER>(); 1393fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis CheckerRef &ref = CheckerTags[tag]; 1403fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis if (ref) 1413fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis return static_cast<CHECKER *>(ref); // already registered. 1423fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis 1439fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis CHECKER *checker = new CHECKER(); 144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines checker->Name = CurrentCheckName; 145769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis CheckerDtors.push_back(CheckerDtor(checker, destruct<CHECKER>)); 1469fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis CHECKER::_register(checker, *this); 1473fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis ref = checker; 1483fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis return checker; 1499fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis } 15043dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 1518dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek template <typename CHECKER> 1528dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek CHECKER *registerChecker(AnalyzerOptions &AOpts) { 1538dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek CheckerTag tag = getTag<CHECKER>(); 1548dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek CheckerRef &ref = CheckerTags[tag]; 1558dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek if (ref) 1568dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek return static_cast<CHECKER *>(ref); // already registered. 1578dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek 1588dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek CHECKER *checker = new CHECKER(AOpts); 159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines checker->Name = CurrentCheckName; 1608dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek CheckerDtors.push_back(CheckerDtor(checker, destruct<CHECKER>)); 1618dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek CHECKER::_register(checker, *this); 1628dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek ref = checker; 1638dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek return checker; 1648dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek } 1658dae128d16bf98759b7a678ce3eebb613bd17109Ted Kremenek 1669fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 167769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis// Functions for running checkers for AST traversing.. 1689fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 1699fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 1709fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis /// \brief Run checkers handling Decls. 1719fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis void runCheckersOnASTDecl(const Decl *D, AnalysisManager& mgr, 1729fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis BugReporter &BR); 1739fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 1749fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis /// \brief Run checkers handling Decls containing a Stmt body. 1759fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis void runCheckersOnASTBody(const Decl *D, AnalysisManager& mgr, 1769fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis BugReporter &BR); 1779fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 1789fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 179769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis// Functions for running checkers for path-sensitive checking. 180769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 181769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 182769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// \brief Run checkers for pre-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, runCheckersForPostStmt 188769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void runCheckersForPreStmt(ExplodedNodeSet &Dst, 189cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis const ExplodedNodeSet &Src, 190769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis const Stmt *S, 191769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis ExprEngine &Eng) { 192769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis runCheckersForStmt(/*isPreVisit=*/true, Dst, Src, S, Eng); 193769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 194769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 195769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// \brief Run checkers for post-visiting Stmts. 196c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// 197c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// The notification is performed for every explored CFGElement, which does 198c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// not include the control flow statements such as IfStmt. 199c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// 200c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// \sa runCheckersForBranchCondition, runCheckersForPreStmt 201769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void runCheckersForPostStmt(ExplodedNodeSet &Dst, 202cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis const ExplodedNodeSet &Src, 203769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis const Stmt *S, 204514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek ExprEngine &Eng, 205514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek bool wasInlined = false) { 206514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek runCheckersForStmt(/*isPreVisit=*/false, Dst, Src, S, Eng, wasInlined); 207769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 208769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 209769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// \brief Run checkers for visiting Stmts. 210769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void runCheckersForStmt(bool isPreVisit, 211cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, 212514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek const Stmt *S, ExprEngine &Eng, 213514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek bool wasInlined = false); 214769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 215769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// \brief Run checkers for pre-visiting obj-c messages. 216769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void runCheckersForPreObjCMessage(ExplodedNodeSet &Dst, 217cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis const ExplodedNodeSet &Src, 218de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose const ObjCMethodCall &msg, 219769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis ExprEngine &Eng) { 220a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar runCheckersForObjCMessage(ObjCMessageVisitKind::Pre, Dst, Src, msg, Eng); 221769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 222769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 223769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// \brief Run checkers for post-visiting obj-c messages. 224769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void runCheckersForPostObjCMessage(ExplodedNodeSet &Dst, 225cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis const ExplodedNodeSet &Src, 226de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose const ObjCMethodCall &msg, 22757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose ExprEngine &Eng, 22857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose bool wasInlined = false) { 229a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar runCheckersForObjCMessage(ObjCMessageVisitKind::Post, Dst, Src, msg, Eng, 23057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose wasInlined); 231769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis } 232769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 233a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar /// \brief Run checkers for visiting an obj-c message to nil. 234a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar void runCheckersForObjCMessageNil(ExplodedNodeSet &Dst, 235a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const ExplodedNodeSet &Src, 236a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const ObjCMethodCall &msg, 237a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar ExprEngine &Eng) { 238a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar runCheckersForObjCMessage(ObjCMessageVisitKind::MessageNil, Dst, Src, msg, 239a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar Eng); 240a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar } 241a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 242a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 243769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// \brief Run checkers for visiting obj-c messages. 244a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar void runCheckersForObjCMessage(ObjCMessageVisitKind visitKind, 245cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis ExplodedNodeSet &Dst, 246cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis const ExplodedNodeSet &Src, 24757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose const ObjCMethodCall &msg, ExprEngine &Eng, 24857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose bool wasInlined = false); 249769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 25096479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose /// \brief Run checkers for pre-visiting obj-c messages. 25196479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose void runCheckersForPreCall(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, 25296479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose const CallEvent &Call, ExprEngine &Eng) { 25396479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose runCheckersForCallEvent(/*isPreVisit=*/true, Dst, Src, Call, Eng); 25496479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose } 25596479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose 25696479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose /// \brief Run checkers for post-visiting obj-c messages. 25796479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose void runCheckersForPostCall(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, 25857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose const CallEvent &Call, ExprEngine &Eng, 25957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose bool wasInlined = false) { 26057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose runCheckersForCallEvent(/*isPreVisit=*/false, Dst, Src, Call, Eng, 26157c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose wasInlined); 26296479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose } 26396479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose 26496479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose /// \brief Run checkers for visiting obj-c messages. 26596479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose void runCheckersForCallEvent(bool isPreVisit, ExplodedNodeSet &Dst, 26696479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose const ExplodedNodeSet &Src, 26757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose const CallEvent &Call, ExprEngine &Eng, 26857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose bool wasInlined = false); 26996479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose 270769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis /// \brief Run checkers for load/store of a location. 271769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void runCheckersForLocation(ExplodedNodeSet &Dst, 272cd50e136ad7dc721822f5e6350769a37c216612dArgyrios Kyrtzidis const ExplodedNodeSet &Src, 273bd613137499b1d4c3b63dccd0aa21f6add243f4fTed Kremenek SVal location, 274bd613137499b1d4c3b63dccd0aa21f6add243f4fTed Kremenek bool isLoad, 275bd613137499b1d4c3b63dccd0aa21f6add243f4fTed Kremenek const Stmt *NodeEx, 276bd613137499b1d4c3b63dccd0aa21f6add243f4fTed Kremenek const Stmt *BoundEx, 277769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis ExprEngine &Eng); 278769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 279312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis /// \brief Run checkers for binding of a value to a location. 280312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis void runCheckersForBind(ExplodedNodeSet &Dst, 281312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis const ExplodedNodeSet &Src, 282312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis SVal location, SVal val, 283ebae6d0209e1ec3d5ea14f9e63bd0d740218ed14Anna Zaks const Stmt *S, ExprEngine &Eng, 2843682f1ea9c7fddc7dcbc590891158ba40f7fca16Jordan Rose const ProgramPoint &PP); 285312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis 28630726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis /// \brief Run checkers for end of analysis. 28730726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis void runCheckersForEndAnalysis(ExplodedGraph &G, BugReporter &BR, 28830726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis ExprEngine &Eng); 28930726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis 290344c77aac25e5d960aced3f45fbaa09853383f6dAnna Zaks /// \brief Run checkers on end of function. 291344c77aac25e5d960aced3f45fbaa09853383f6dAnna Zaks void runCheckersForEndFunction(NodeBuilderContext &BC, 292344c77aac25e5d960aced3f45fbaa09853383f6dAnna Zaks ExplodedNodeSet &Dst, 293344c77aac25e5d960aced3f45fbaa09853383f6dAnna Zaks ExplodedNode *Pred, 294344c77aac25e5d960aced3f45fbaa09853383f6dAnna Zaks ExprEngine &Eng); 295af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis 296cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis /// \brief Run checkers for branch condition. 297cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis void runCheckersForBranchCondition(const Stmt *condition, 298f236b6503a4dbc44c1fccb8756bd57c9d0efdf05Anna Zaks ExplodedNodeSet &Dst, ExplodedNode *Pred, 2994e82d3cf6fd4c907265e3fa3aac0a835c35dc759Anna Zaks ExprEngine &Eng); 300cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis 301183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis /// \brief Run checkers for live symbols. 302c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// 303c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// Allows modifying SymbolReaper object. For example, checkers can explicitly 304c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// register symbols of interest as live. These symbols will not be marked 305c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// dead and removed. 30623111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek void runCheckersForLiveSymbols(ProgramStateRef state, 307183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis SymbolReaper &SymReaper); 308183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 309183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis /// \brief Run checkers for dead symbols. 310c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// 311c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// Notifies checkers when symbols become dead. For example, this allows 312c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// checkers to aggressively clean up/reduce the checker state and produce 313c41f3652f4e836cff988320bad2d6c5f416ebe1fAnna Zaks /// precise diagnostics. 314183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis void runCheckersForDeadSymbols(ExplodedNodeSet &Dst, 315183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis const ExplodedNodeSet &Src, 316183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis SymbolReaper &SymReaper, const Stmt *S, 3170b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks ExprEngine &Eng, 3180b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks ProgramPoint::Kind K); 319183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 320183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis /// \brief True if at least one checker wants to check region changes. 32123111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek bool wantsRegionChangeUpdate(ProgramStateRef state); 322183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 323183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis /// \brief Run checkers for region changes. 324537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// 325537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// This corresponds to the check::RegionChanges callback. 326537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// \param state The current program state. 327537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// \param invalidated A set of all symbols potentially touched by the change. 328537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// \param ExplicitRegions The regions explicitly requested for invalidation. 329537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// For example, in the case of a function call, these would be arguments. 330537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// \param Regions The transitive closure of accessible regions, 331537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose /// i.e. all regions that may have been touched by this change. 3327c0d2a366d2810e711f9c6ced8cbd923b9fc823aJames Dennett /// \param Call The call expression wrapper if the regions are invalidated 3337c0d2a366d2810e711f9c6ced8cbd923b9fc823aJames Dennett /// by a call. 3347c0d2a366d2810e711f9c6ced8cbd923b9fc823aJames Dennett ProgramStateRef 33523111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek runCheckersForRegionChanges(ProgramStateRef state, 336bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks const InvalidatedSymbols *invalidated, 337537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose ArrayRef<const MemRegion *> ExplicitRegions, 33866c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks ArrayRef<const MemRegion *> Regions, 339740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const CallEvent *Call); 340183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 341bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks /// \brief Run checkers when pointers escape. 342bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks /// 343bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks /// This notifies the checkers about pointer escape, which occurs whenever 3441655bcd052a67a3050fc55df8ecce57342352e68Anna Zaks /// the analyzer cannot track the symbol any more. For example, as a 345bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks /// result of assigning a pointer into a global or when it's passed to a 346bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks /// function call the analyzer cannot model. 347bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks /// 348bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks /// \param State The state at the point of escape. 349bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks /// \param Escaped The list of escaped symbols. 350bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks /// \param Call The corresponding CallEvent, if the symbols escape as 3511655bcd052a67a3050fc55df8ecce57342352e68Anna Zaks /// parameters to the given call. 352da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev /// \param Kind The reason of pointer escape. 353da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev /// \param ITraits Information about invalidation for a particular 354da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev /// region/symbol. 355bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks /// \returns Checkers can modify the state by returning a new one. 3561655bcd052a67a3050fc55df8ecce57342352e68Anna Zaks ProgramStateRef 3571655bcd052a67a3050fc55df8ecce57342352e68Anna Zaks runCheckersForPointerEscape(ProgramStateRef State, 3581655bcd052a67a3050fc55df8ecce57342352e68Anna Zaks const InvalidatedSymbols &Escaped, 359233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks const CallEvent *Call, 36041988f331a74a72cf243a2a68ffb56418e9a174eAnna Zaks PointerEscapeKind Kind, 361da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev RegionAndSymbolInvalidationTraits *ITraits); 362bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks 363312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis /// \brief Run checkers for handling assumptions on symbolic values. 36423111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek ProgramStateRef runCheckersForEvalAssume(ProgramStateRef state, 3651655bcd052a67a3050fc55df8ecce57342352e68Anna Zaks SVal Cond, bool Assumption); 366312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis 367e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis /// \brief Run checkers for evaluating a call. 368645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /// 369645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /// Warning: Currently, the CallEvent MUST come from a CallExpr! 370e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis void runCheckersForEvalCall(ExplodedNodeSet &Dst, 371e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis const ExplodedNodeSet &Src, 372645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose const CallEvent &CE, ExprEngine &Eng); 3739be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek 3749be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek /// \brief Run checkers for the entire Translation Unit. 3759c378f705405d37f49795d5e915989de774fe11fTed Kremenek void runCheckersOnEndOfTranslationUnit(const TranslationUnitDecl *TU, 3769be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek AnalysisManager &mgr, 3779be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek BugReporter &BR); 378e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis 379dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// \brief Run checkers for debug-printing a ProgramState. 380dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// 381dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// Unlike most other callbacks, any checker can simply implement the virtual 382dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// method CheckerBase::printState if it has custom data to print. 383dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// \param Out The output stream 384dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// \param State The state being printed 385dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// \param NL The preferred representation of a newline. 386dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose /// \param Sep The preferred separator between different kinds of data. 38723111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek void runCheckersForPrintState(raw_ostream &Out, ProgramStateRef State, 388dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose const char *NL, const char *Sep); 389dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose 390769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 391769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis// Internal registration functions for AST traversing. 3929fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 3939fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 3949fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis // Functions used by the registration mechanism, checkers should not touch 3959fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis // these directly. 3969fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 3974d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef CheckerFn<void (const Decl *, AnalysisManager&, BugReporter &)> 398769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis CheckDeclFunc; 399769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 4009fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis typedef bool (*HandlesDeclFunc)(const Decl *D); 401769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void _registerForDecl(CheckDeclFunc checkfn, HandlesDeclFunc isForDeclFn); 4029fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 403769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void _registerForBody(CheckDeclFunc checkfn); 404769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 405769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 406769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis// Internal registration functions for path-sensitive checking. 407769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 408769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 4094d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef CheckerFn<void (const Stmt *, CheckerContext &)> CheckStmtFunc; 4104d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 411de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose typedef CheckerFn<void (const ObjCMethodCall &, CheckerContext &)> 4124d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis CheckObjCMessageFunc; 41396479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose 41496479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose typedef CheckerFn<void (const CallEvent &, CheckerContext &)> 41596479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose CheckCallFunc; 4164d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 417bd613137499b1d4c3b63dccd0aa21f6add243f4fTed Kremenek typedef CheckerFn<void (const SVal &location, bool isLoad, 418bd613137499b1d4c3b63dccd0aa21f6add243f4fTed Kremenek const Stmt *S, 419390909c89c98ab1807e15e033a72e975f866fb23Anna Zaks CheckerContext &)> 420769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis CheckLocationFunc; 4214d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 422390909c89c98ab1807e15e033a72e975f866fb23Anna Zaks typedef CheckerFn<void (const SVal &location, const SVal &val, 423390909c89c98ab1807e15e033a72e975f866fb23Anna Zaks const Stmt *S, CheckerContext &)> 424390909c89c98ab1807e15e033a72e975f866fb23Anna Zaks CheckBindFunc; 4254d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 4264d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef CheckerFn<void (ExplodedGraph &, BugReporter &, ExprEngine &)> 42730726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis CheckEndAnalysisFunc; 4284d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 429af498a28797c075c48d7e943df5f5a8e78ed8eb0Anna Zaks typedef CheckerFn<void (CheckerContext &)> 430344c77aac25e5d960aced3f45fbaa09853383f6dAnna Zaks CheckEndFunctionFunc; 4314d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 432f236b6503a4dbc44c1fccb8756bd57c9d0efdf05Anna Zaks typedef CheckerFn<void (const Stmt *, CheckerContext &)> 433cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis CheckBranchConditionFunc; 4344d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 4354d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef CheckerFn<void (SymbolReaper &, CheckerContext &)> 4364d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis CheckDeadSymbolsFunc; 4374d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 43823111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek typedef CheckerFn<void (ProgramStateRef,SymbolReaper &)> CheckLiveSymbolsFunc; 4394d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 44023111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek typedef CheckerFn<ProgramStateRef (ProgramStateRef, 441bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks const InvalidatedSymbols *symbols, 44266c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks ArrayRef<const MemRegion *> ExplicitRegions, 44366c40400e7d6272b0cd675ada18dd62c1f0362c7Anna Zaks ArrayRef<const MemRegion *> Regions, 444740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const CallEvent *Call)> 4454d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis CheckRegionChangesFunc; 4464d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 44723111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek typedef CheckerFn<bool (ProgramStateRef)> WantsRegionChangeUpdateFunc; 448bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks 449bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks typedef CheckerFn<ProgramStateRef (ProgramStateRef, 450bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks const InvalidatedSymbols &Escaped, 451233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks const CallEvent *Call, 45241988f331a74a72cf243a2a68ffb56418e9a174eAnna Zaks PointerEscapeKind Kind, 453da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev RegionAndSymbolInvalidationTraits *ITraits)> 454bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks CheckPointerEscapeFunc; 4554d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 45623111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek typedef CheckerFn<ProgramStateRef (ProgramStateRef, 45718c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek const SVal &cond, bool assumption)> 4584d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis EvalAssumeFunc; 4594d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis 4604d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef CheckerFn<bool (const CallExpr *, CheckerContext &)> 4614d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis EvalCallFunc; 462769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 4639be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek typedef CheckerFn<void (const TranslationUnitDecl *, 4649be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek AnalysisManager&, BugReporter &)> 4659be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek CheckEndOfTranslationUnit; 4669be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek 467769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis typedef bool (*HandlesStmtFunc)(const Stmt *D); 468769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void _registerForPreStmt(CheckStmtFunc checkfn, 469769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis HandlesStmtFunc isForStmtFn); 470769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void _registerForPostStmt(CheckStmtFunc checkfn, 471769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis HandlesStmtFunc isForStmtFn); 472769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 473769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void _registerForPreObjCMessage(CheckObjCMessageFunc checkfn); 474769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void _registerForPostObjCMessage(CheckObjCMessageFunc checkfn); 475769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 476a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar void _registerForObjCMessageNil(CheckObjCMessageFunc checkfn); 477a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 47896479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose void _registerForPreCall(CheckCallFunc checkfn); 47996479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose void _registerForPostCall(CheckCallFunc checkfn); 48096479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose 481769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis void _registerForLocation(CheckLocationFunc checkfn); 482769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 483312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis void _registerForBind(CheckBindFunc checkfn); 484312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis 48530726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis void _registerForEndAnalysis(CheckEndAnalysisFunc checkfn); 48630726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis 487344c77aac25e5d960aced3f45fbaa09853383f6dAnna Zaks void _registerForEndFunction(CheckEndFunctionFunc checkfn); 488af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis 489cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis void _registerForBranchCondition(CheckBranchConditionFunc checkfn); 490cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis 491183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis void _registerForLiveSymbols(CheckLiveSymbolsFunc checkfn); 492183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 493183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis void _registerForDeadSymbols(CheckDeadSymbolsFunc checkfn); 494183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 495183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis void _registerForRegionChanges(CheckRegionChangesFunc checkfn, 496183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis WantsRegionChangeUpdateFunc wantUpdateFn); 497183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 498bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks void _registerForPointerEscape(CheckPointerEscapeFunc checkfn); 499bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks 50041988f331a74a72cf243a2a68ffb56418e9a174eAnna Zaks void _registerForConstPointerEscape(CheckPointerEscapeFunc checkfn); 50141988f331a74a72cf243a2a68ffb56418e9a174eAnna Zaks 502312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis void _registerForEvalAssume(EvalAssumeFunc checkfn); 503312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis 504e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis void _registerForEvalCall(EvalCallFunc checkfn); 505e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis 5069be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek void _registerForEndOfTranslationUnit(CheckEndOfTranslationUnit checkfn); 5079be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek 508769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 509deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis// Internal registration functions for events. 510deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 511deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 512deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis typedef void *EventTag; 5134d840e9ac4d8e9baa9459ca3dd7ab14ae884a80fArgyrios Kyrtzidis typedef CheckerFn<void (const void *event)> CheckEventFunc; 514deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 515deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis template <typename EVENT> 516deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis void _registerListenerForEvent(CheckEventFunc checkfn) { 517deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis EventInfo &info = Events[getTag<EVENT>()]; 518deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis info.Checkers.push_back(checkfn); 519deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis } 520deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 521deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis template <typename EVENT> 522deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis void _registerDispatcherForEvent() { 523deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis EventInfo &info = Events[getTag<EVENT>()]; 524deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis info.HasDispatcher = true; 525deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis } 526deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 527deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis template <typename EVENT> 528deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis void _dispatchEvent(const EVENT &event) const { 529deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis EventsTy::const_iterator I = Events.find(getTag<EVENT>()); 530deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis if (I == Events.end()) 531deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis return; 532deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis const EventInfo &info = I->second; 533deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis for (unsigned i = 0, e = info.Checkers.size(); i != e; ++i) 534deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis info.Checkers[i](&event); 535deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis } 536deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 537deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 538769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis// Implementation details. 539769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 54043dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 54143dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidisprivate: 5429fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis template <typename CHECKER> 5439fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis static void destruct(void *obj) { delete static_cast<CHECKER *>(obj); } 5449fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 545deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis template <typename T> 546deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis static void *getTag() { static int tag; return &tag; } 5473fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis 5483fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis llvm::DenseMap<CheckerTag, CheckerRef> CheckerTags; 5493fe71f445f76003649b5da24209e80225a7ee74fArgyrios Kyrtzidis 550769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis std::vector<CheckerDtor> CheckerDtors; 551769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 5529fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis struct DeclCheckerInfo { 5539fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis CheckDeclFunc CheckFn; 5549fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis HandlesDeclFunc IsForDeclFn; 5559fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis }; 5569fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis std::vector<DeclCheckerInfo> DeclCheckers; 5579fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 558769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis std::vector<CheckDeclFunc> BodyCheckers; 5599fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis 560686775deca8b8685eb90801495880e3abdd844c2Chris Lattner typedef SmallVector<CheckDeclFunc, 4> CachedDeclCheckers; 5619fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis typedef llvm::DenseMap<unsigned, CachedDeclCheckers> CachedDeclCheckersMapTy; 5629fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis CachedDeclCheckersMapTy CachedDeclCheckersMap; 563769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 564769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis struct StmtCheckerInfo { 565769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis CheckStmtFunc CheckFn; 566769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis HandlesStmtFunc IsForStmtFn; 567769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis bool IsPreVisit; 568769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis }; 569769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis std::vector<StmtCheckerInfo> StmtCheckers; 570769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 571686775deca8b8685eb90801495880e3abdd844c2Chris Lattner typedef SmallVector<CheckStmtFunc, 4> CachedStmtCheckers; 572e9a906b99286b44dcf5eb896f17df74d588e4ce9Benjamin Kramer typedef llvm::DenseMap<unsigned, CachedStmtCheckers> CachedStmtCheckersMapTy; 573769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis CachedStmtCheckersMapTy CachedStmtCheckersMap; 574769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 575e9a906b99286b44dcf5eb896f17df74d588e4ce9Benjamin Kramer const CachedStmtCheckers &getCachedStmtCheckersFor(const Stmt *S, 576e9a906b99286b44dcf5eb896f17df74d588e4ce9Benjamin Kramer bool isPreVisit); 577769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 578a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar /// Returns the checkers that have registered for callbacks of the 579a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar /// given \p Kind. 580a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const std::vector<CheckObjCMessageFunc> & 581a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar getObjCMessageCheckers(ObjCMessageVisitKind Kind); 582a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 583769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis std::vector<CheckObjCMessageFunc> PreObjCMessageCheckers; 584769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis std::vector<CheckObjCMessageFunc> PostObjCMessageCheckers; 585a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar std::vector<CheckObjCMessageFunc> ObjCMessageNilCheckers; 586769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis 58796479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose std::vector<CheckCallFunc> PreCallCheckers; 58896479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose std::vector<CheckCallFunc> PostCallCheckers; 58996479da6ad9d921d875e7be29fe1bfa127be8069Jordan Rose 590769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis std::vector<CheckLocationFunc> LocationCheckers; 59130726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis 592312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis std::vector<CheckBindFunc> BindCheckers; 593312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis 59430726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis std::vector<CheckEndAnalysisFunc> EndAnalysisCheckers; 595e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis 596344c77aac25e5d960aced3f45fbaa09853383f6dAnna Zaks std::vector<CheckEndFunctionFunc> EndFunctionCheckers; 597af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis 598cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis std::vector<CheckBranchConditionFunc> BranchConditionCheckers; 599cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis 600183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis std::vector<CheckLiveSymbolsFunc> LiveSymbolsCheckers; 601183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 602183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis std::vector<CheckDeadSymbolsFunc> DeadSymbolsCheckers; 603183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 604183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis struct RegionChangesCheckerInfo { 605183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis CheckRegionChangesFunc CheckFn; 606183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis WantsRegionChangeUpdateFunc WantUpdateFn; 607183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis }; 608183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis std::vector<RegionChangesCheckerInfo> RegionChangesCheckers; 609183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis 610bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks std::vector<CheckPointerEscapeFunc> PointerEscapeCheckers; 611bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks 612312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis std::vector<EvalAssumeFunc> EvalAssumeCheckers; 613312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis 614e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis std::vector<EvalCallFunc> EvalCallCheckers; 615deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 6169be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek std::vector<CheckEndOfTranslationUnit> EndOfTranslationUnitCheckers; 6179be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek 618deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis struct EventInfo { 619686775deca8b8685eb90801495880e3abdd844c2Chris Lattner SmallVector<CheckEventFunc, 4> Checkers; 620deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis bool HasDispatcher; 621deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis EventInfo() : HasDispatcher(false) { } 622deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis }; 623deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis 624deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis typedef llvm::DenseMap<EventTag, EventInfo> EventsTy; 625deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis EventsTy Events; 62643dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis}; 62743dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 62843dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis} // end ento namespace 62943dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 63043dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis} // end clang namespace 63143dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 63243dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis#endif 633