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