ExprEngine.h revision 1aae01a8308d2f8e31adab3f4d7ac35543aac680
1d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis//===-- ExprEngine.h - Path-Sensitive Expression-Level Dataflow ---*- C++ -*-=//
277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek//
377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek//                     The LLVM Compiler Infrastructure
477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek//
577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek// This file is distributed under the University of Illinois Open Source
677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek// License. See LICENSE.TXT for details.
777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek//
877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek//===----------------------------------------------------------------------===//
977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek//
10b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek//  This file defines a meta-engine for path-sensitive dataflow analysis that
11d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis//  is built on CoreEngine, but provides the boilerplate to execute transfer
12b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek//  functions and build the ExplodedGraph at the expression level.
1377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek//
1477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek//===----------------------------------------------------------------------===//
1577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
16d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis#ifndef LLVM_CLANG_GR_EXPRENGINE
17d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis#define LLVM_CLANG_GR_EXPRENGINE
18d065d6080f0620bb80b933f3f5d52d37bb2ea770Ted Kremenek
199b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
209b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h"
219b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h"
2218c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
239b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
24c0c3f5dbc9e78aa53a86c7d5e3eeda23ddad93d6Ted Kremenek#include "clang/AST/Type.h"
25f494b579b22f9950f5af021f0bf9879a91bb8b41Steve Naroff#include "clang/AST/ExprObjC.h"
26bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu#include "clang/AST/ExprCXX.h"
274beaa9f51b2da57c64740cef2bd1c2fdb0c325d5Ted Kremenek#include "clang/AST/StmtObjC.h"
2877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpnamespace clang {
305a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
311d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenekclass AnalysisDeclContextManager;
325a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass ObjCForCollectionStmt;
33b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek
349ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento {
355a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
365e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass AnalysisManager;
37f5e39ece75b18c9ce19351929d4879ad9731e7f5Jordy Roseclass CallOrObjCMessage;
38f5e39ece75b18c9ce19351929d4879ad9731e7f5Jordy Roseclass ObjCMessage;
39f494b579b22f9950f5af021f0bf9879a91bb8b41Steve Naroff
40d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidisclass ExprEngine : public SubEngine {
4125e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu  AnalysisManager &AMgr;
42b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek
431d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContextManager &AnalysisDeclContexts;
4425e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu
45d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  CoreEngine Engine;
461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  /// G - the simulation graph.
48031ccc0555a82afc2e8afe29e19dd57ff204e2deZhongxing Xu  ExplodedGraph& G;
491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  /// Builder - The current StmtNodeBuilder which is used when building the
51b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  ///  nodes for a given statement.
52d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  StmtNodeBuilder* Builder;
531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
54b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  /// StateMgr - Object that manages the data for all created states.
5518c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  ProgramStateManager StateMgr;
56cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
57b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  /// SymMgr - Object that manages the symbol information.
58b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  SymbolManager& SymMgr;
591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
60846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek  /// svalBuilder - SValBuilder object that creates SVals from expressions.
61846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek  SValBuilder &svalBuilder;
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63846d4e923bf11bcdc2816758aafa331795f29230Ted Kremenek  /// EntryNode - The immediate predecessor node.
649c378f705405d37f49795d5e915989de774fe11fTed Kremenek  ExplodedNode *EntryNode;
65846d4e923bf11bcdc2816758aafa331795f29230Ted Kremenek
66846d4e923bf11bcdc2816758aafa331795f29230Ted Kremenek  /// CleanedState - The state for EntryNode "cleaned" of all dead
670d093d3005dd583675a45a85bd688063572cc8afTed Kremenek  ///  variables and symbols (as determined by a liveness analysis).
6818c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  const ProgramState *CleanedState;
691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
700a3ed3143b00f237decb1288c1ff574ae09eba4eTed Kremenek  /// currentStmt - The current block-level statement.
719c378f705405d37f49795d5e915989de774fe11fTed Kremenek  const Stmt *currentStmt;
721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73a81fffe678107d49a9f1c03d80adf85f18a9867fAnna Zaks  /// Obj-C Class Identifiers.
74e448ab4f9dd162802f5d7cfea60f7830cc61c654Ted Kremenek  IdentifierInfo* NSExceptionII;
751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
76a81fffe678107d49a9f1c03d80adf85f18a9867fAnna Zaks  /// Obj-C Selectors.
77e448ab4f9dd162802f5d7cfea60f7830cc61c654Ted Kremenek  Selector* NSExceptionInstanceRaiseSelectors;
78e448ab4f9dd162802f5d7cfea60f7830cc61c654Ted Kremenek  Selector RaiseSel;
7917a38e2636a8b1ce473fc6504c4b16cb09db29f4Jordy Rose
8017a38e2636a8b1ce473fc6504c4b16cb09db29f4Jordy Rose  /// Whether or not GC is enabled in this analysis.
8117a38e2636a8b1ce473fc6504c4b16cb09db29f4Jordy Rose  bool ObjCGCEnabled;
821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
839e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek  /// The BugReporter associated with this engine.  It is important that
849e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek  ///  this object be placed at the very end of member variables so that its
85d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  ///  destructor is called before the rest of the ExprEngine is destroyed.
86cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek  GRBugReporter BR;
871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
88b22d589e2ccd09cada0bcea136f0966883a8bb11Ted Kremenekpublic:
8917a38e2636a8b1ce473fc6504c4b16cb09db29f4Jordy Rose  ExprEngine(AnalysisManager &mgr, bool gcEnabled);
90cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
91d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  ~ExprEngine();
921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9325e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu  void ExecuteWorkList(const LocationContext *L, unsigned Steps = 150000) {
94d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis    Engine.ExecuteWorkList(L, Steps, 0);
952ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu  }
962ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu
972ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu  /// Execute the work list with an initial state. Nodes that reaches the exit
982ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu  /// of the function are added into the Dst set, which represent the exit
992ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu  /// state of the function call.
1002ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu  void ExecuteWorkListWithInitialState(const LocationContext *L, unsigned Steps,
10118c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                                       const ProgramState *InitState,
1022ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu                                       ExplodedNodeSet &Dst) {
103d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis    Engine.ExecuteWorkListWithInitialState(L, Steps, InitState, Dst);
104b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  }
1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
106b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  /// getContext - Return the ASTContext associated with this analysis.
1079c378f705405d37f49795d5e915989de774fe11fTed Kremenek  ASTContext &getContext() const { return AMgr.getASTContext(); }
1085032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu
1092ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu  virtual AnalysisManager &getAnalysisManager() { return AMgr; }
1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
111769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  CheckerManager &getCheckerManager() const {
112769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis    return *AMgr.getCheckerManager();
113769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  }
114769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis
115846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek  SValBuilder &getSValBuilder() { return svalBuilder; }
1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
117cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek  BugReporter& getBugReporter() { return BR; }
1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
119d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  StmtNodeBuilder &getBuilder() { assert(Builder); return *Builder; }
1201aae01a8308d2f8e31adab3f4d7ac35543aac680Anna Zaks  const NodeBuilderContext &getBuilderContext() {
1211aae01a8308d2f8e31adab3f4d7ac35543aac680Anna Zaks    assert(Builder);
1221aae01a8308d2f8e31adab3f4d7ac35543aac680Anna Zaks    return Builder->getContext();
1231aae01a8308d2f8e31adab3f4d7ac35543aac680Anna Zaks  }
124ec9227fea66c3439991fc84b0d33b0a8b4b8875eZhongxing Xu
12517a38e2636a8b1ce473fc6504c4b16cb09db29f4Jordy Rose  bool isObjCGCEnabled() { return ObjCGCEnabled; }
1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
127e01c98767dfd7153c3c84637c36659e3bbe16ff7Ted Kremenek  /// ViewGraph - Visualize the ExplodedGraph created by executing the
128e01c98767dfd7153c3c84637c36659e3bbe16ff7Ted Kremenek  ///  simulation.
129ffe0f43806d4823271c2406c1fccc2373115c36aTed Kremenek  void ViewGraph(bool trim = false);
1301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
131031ccc0555a82afc2e8afe29e19dd57ff204e2deZhongxing Xu  void ViewGraph(ExplodedNode** Beg, ExplodedNode** End);
1321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
133b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  /// getInitialState - Return the initial state used for the root vertex
134b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  ///  in the ExplodedGraph.
13518c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  const ProgramState *getInitialState(const LocationContext *InitLoc);
1361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
137031ccc0555a82afc2e8afe29e19dd57ff204e2deZhongxing Xu  ExplodedGraph& getGraph() { return G; }
138031ccc0555a82afc2e8afe29e19dd57ff204e2deZhongxing Xu  const ExplodedGraph& getGraph() const { return G; }
13950a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek
140e36de1fe51c39d9161915dd3dbef880954af6476Ted Kremenek  /// processCFGElement - Called by CoreEngine. Used to generate new successor
1419c6cd67ea416bace666d614c84d5531124287653Zhongxing Xu  ///  nodes by processing the 'effects' of a CFG element.
1424e82d3cf6fd4c907265e3fa3aac0a835c35dc759Anna Zaks  void processCFGElement(const CFGElement E, StmtNodeBuilder& Bldr,
1434e82d3cf6fd4c907265e3fa3aac0a835c35dc759Anna Zaks                         ExplodedNode *Pred);
1449c6cd67ea416bace666d614c84d5531124287653Zhongxing Xu
1454e82d3cf6fd4c907265e3fa3aac0a835c35dc759Anna Zaks  void ProcessStmt(const CFGStmt S, StmtNodeBuilder &builder,
1464e82d3cf6fd4c907265e3fa3aac0a835c35dc759Anna Zaks                   ExplodedNode *Pred);
1479c6cd67ea416bace666d614c84d5531124287653Zhongxing Xu
1484e82d3cf6fd4c907265e3fa3aac0a835c35dc759Anna Zaks  void ProcessInitializer(const CFGInitializer I, StmtNodeBuilder &Bldr,
1494e82d3cf6fd4c907265e3fa3aac0a835c35dc759Anna Zaks                          ExplodedNode *Pred);
1509c6cd67ea416bace666d614c84d5531124287653Zhongxing Xu
1514e82d3cf6fd4c907265e3fa3aac0a835c35dc759Anna Zaks  void ProcessImplicitDtor(const CFGImplicitDtor D, StmtNodeBuilder &builder,
1524e82d3cf6fd4c907265e3fa3aac0a835c35dc759Anna Zaks                           ExplodedNode *Pred);
1531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1544ffcb9974c6b7142c4a1483abfcb1f88b6371c45Zhongxing Xu  void ProcessAutomaticObjDtor(const CFGAutomaticObjDtor D,
1554e82d3cf6fd4c907265e3fa3aac0a835c35dc759Anna Zaks                               StmtNodeBuilder &builder, ExplodedNode *Pred);
156d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  void ProcessBaseDtor(const CFGBaseDtor D, StmtNodeBuilder &builder);
157d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  void ProcessMemberDtor(const CFGMemberDtor D, StmtNodeBuilder &builder);
1584ffcb9974c6b7142c4a1483abfcb1f88b6371c45Zhongxing Xu  void ProcessTemporaryDtor(const CFGTemporaryDtor D,
159d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis                            StmtNodeBuilder &builder);
1604ffcb9974c6b7142c4a1483abfcb1f88b6371c45Zhongxing Xu
16127c54e57c4a012dcdf2b40cf985b70d0b9caa69eTed Kremenek  /// Called by CoreEngine when processing the entrance of a CFGBlock.
16227c54e57c4a012dcdf2b40cf985b70d0b9caa69eTed Kremenek  virtual void processCFGBlockEntrance(ExplodedNodeSet &dstNodes,
16327c54e57c4a012dcdf2b40cf985b70d0b9caa69eTed Kremenek                                GenericNodeBuilder<BlockEntrance> &nodeBuilder);
16427c54e57c4a012dcdf2b40cf985b70d0b9caa69eTed Kremenek
165d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  /// ProcessBranch - Called by CoreEngine.  Used to generate successor
166b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  ///  nodes by processing the 'effects' of a branch condition.
1679c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void processBranch(const Stmt *Condition, const Stmt *Term,
168a19f4af7a94835ce4693bfe12d6270754e79eb56Anna Zaks                     NodeBuilderContext& BuilderCtx,
169ad62deeb70e97da6bd514dd390ea1ce6af6ad81dAnna Zaks                     ExplodedNode *Pred,
1701aae01a8308d2f8e31adab3f4d7ac35543aac680Anna Zaks                     ExplodedNodeSet &Dst,
171a19f4af7a94835ce4693bfe12d6270754e79eb56Anna Zaks                     const CFGBlock *DstT,
172a19f4af7a94835ce4693bfe12d6270754e79eb56Anna Zaks                     const CFGBlock *DstF);
1731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
174e36de1fe51c39d9161915dd3dbef880954af6476Ted Kremenek  /// processIndirectGoto - Called by CoreEngine.  Used to generate successor
175b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  ///  nodes by processing the 'effects' of a computed goto jump.
176e36de1fe51c39d9161915dd3dbef880954af6476Ted Kremenek  void processIndirectGoto(IndirectGotoNodeBuilder& builder);
1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
178d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  /// ProcessSwitch - Called by CoreEngine.  Used to generate successor
179b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  ///  nodes by processing the 'effects' of a switch statement.
180e36de1fe51c39d9161915dd3dbef880954af6476Ted Kremenek  void processSwitch(SwitchNodeBuilder& builder);
1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
182d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  /// ProcessEndPath - Called by CoreEngine.  Used to generate end-of-path
18311062b118476368fa5b294954713e5df97d8599fTed Kremenek  ///  nodes when the control reaches the end of a function.
184e36de1fe51c39d9161915dd3dbef880954af6476Ted Kremenek  void processEndOfFunction(EndOfFunctionNodeBuilder& builder);
185102acd5369bbb17c0d6ab868af376671acff7a93Douglas Gregor
186ccc263b44c62ce3a02f797a3ddb3d6017cf0e5e4Ted Kremenek  /// Generate the entry node of the callee.
187e36de1fe51c39d9161915dd3dbef880954af6476Ted Kremenek  void processCallEnter(CallEnterNodeBuilder &builder);
188102acd5369bbb17c0d6ab868af376671acff7a93Douglas Gregor
189ccc263b44c62ce3a02f797a3ddb3d6017cf0e5e4Ted Kremenek  /// Generate the first post callsite node.
190e36de1fe51c39d9161915dd3dbef880954af6476Ted Kremenek  void processCallExit(CallExitNodeBuilder &builder);
191102acd5369bbb17c0d6ab868af376671acff7a93Douglas Gregor
192d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  /// Called by CoreEngine when the analysis worklist has terminated.
193e36de1fe51c39d9161915dd3dbef880954af6476Ted Kremenek  void processEndWorklist(bool hasWorkRemaining);
194ccc263b44c62ce3a02f797a3ddb3d6017cf0e5e4Ted Kremenek
1959c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek  /// evalAssume - Callback function invoked by the ConstraintManager when
19632a58084a4c53e6938dd81bfce224db25a5976d1Ted Kremenek  ///  making assumptions about state values.
19718c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  const ProgramState *processAssume(const ProgramState *state, SVal cond,bool assumption);
1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19918c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  /// wantsRegionChangeUpdate - Called by ProgramStateManager to determine if a
200e36de1fe51c39d9161915dd3dbef880954af6476Ted Kremenek  ///  region change should trigger a processRegionChanges update.
20118c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  bool wantsRegionChangeUpdate(const ProgramState *state);
202c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose
20318c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  /// processRegionChanges - Called by ProgramStateManager whenever a change is made
204c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose  ///  to the store. Used to update checkers that track region values.
20518c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  const ProgramState *
20618c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  processRegionChanges(const ProgramState *state,
20735bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenek                       const StoreManager::InvalidatedSymbols *invalidated,
208537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose                       ArrayRef<const MemRegion *> ExplicitRegions,
209537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose                       ArrayRef<const MemRegion *> Regions);
210c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose
211dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose  /// printState - Called by ProgramStateManager to print checker-specific data.
212dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose  void printState(raw_ostream &Out, const ProgramState *State,
213dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose                  const char *NL, const char *Sep);
214dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose
21518c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  virtual ProgramStateManager& getStateManager() { return StateMgr; }
21690e72e4106a0c3efa7575e9f9cba0c775bb54552Zhongxing Xu
21790e72e4106a0c3efa7575e9f9cba0c775bb54552Zhongxing Xu  StoreManager& getStoreManager() { return StateMgr.getStoreManager(); }
2181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
219a516ce16b472e61924f5dd10d181c3e8330979afTed Kremenek  ConstraintManager& getConstraintManager() {
220a516ce16b472e61924f5dd10d181c3e8330979afTed Kremenek    return StateMgr.getConstraintManager();
221a516ce16b472e61924f5dd10d181c3e8330979afTed Kremenek  }
2221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
223c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  // FIXME: Remove when we migrate over to just using SValBuilder.
2246297a8ec313c722db50f686fd190842b7ea91118Ted Kremenek  BasicValueFactory& getBasicVals() {
2256297a8ec313c722db50f686fd190842b7ea91118Ted Kremenek    return StateMgr.getBasicVals();
2266297a8ec313c722db50f686fd190842b7ea91118Ted Kremenek  }
2276297a8ec313c722db50f686fd190842b7ea91118Ted Kremenek  const BasicValueFactory& getBasicVals() const {
2286297a8ec313c722db50f686fd190842b7ea91118Ted Kremenek    return StateMgr.getBasicVals();
2296297a8ec313c722db50f686fd190842b7ea91118Ted Kremenek  }
2301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
231044b6f0417cb98741f277602fabf5f07ec9a02c0Ted Kremenek  // FIXME: Remove when we migrate over to just using ValueManager.
23200a3a5f024ac54088ab887712b292171188064f0Ted Kremenek  SymbolManager& getSymbolManager() { return SymMgr; }
23300a3a5f024ac54088ab887712b292171188064f0Ted Kremenek  const SymbolManager& getSymbolManager() const { return SymMgr; }
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
235bc42c533e7d3d946704a49e242939dd232f33072Tom Care  // Functions for external checking of whether we have unfinished work
236422ab7a49a9a4252dbc6350e49d7a5708337b9c7Ted Kremenek  bool wasBlocksExhausted() const { return Engine.wasBlocksExhausted(); }
237d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  bool hasEmptyWorkList() const { return !Engine.getWorkList()->hasWork(); }
238422ab7a49a9a4252dbc6350e49d7a5708337b9c7Ted Kremenek  bool hasWorkRemaining() const { return Engine.hasWorkRemaining(); }
239bc42c533e7d3d946704a49e242939dd232f33072Tom Care
240d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  const CoreEngine &getCoreEngine() const { return Engine; }
241bc42c533e7d3d946704a49e242939dd232f33072Tom Care
2421670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenekpublic:
2439c378f705405d37f49795d5e915989de774fe11fTed Kremenek  ExplodedNode *MakeNode(ExplodedNodeSet &Dst, const Stmt *S,
24418c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                         ExplodedNode *Pred, const ProgramState *St,
245bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu                         ProgramPoint::Kind K = ProgramPoint::PostStmtKind,
246ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek                         const ProgramPointTag *tag = 0);
2477b71c1977cccafa23f9ecb3b0b22199e61ae634cZhongxing Xu
248b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  /// Visit - Transfer function logic for all statements.  Dispatches to
249b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  ///  other functions that handle specific kinds of statements.
2509c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void Visit(const Stmt *S, ExplodedNode *Pred, ExplodedNodeSet &Dst);
2511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
252c5b1bf10133a8ecbfe9e6b3ec92bae84e3d927e8Ted Kremenek  /// VisitArraySubscriptExpr - Transfer function for array accesses.
2539c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitLvalArraySubscriptExpr(const ArraySubscriptExpr *Ex,
2549c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                   ExplodedNode *Pred,
2559c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                   ExplodedNodeSet &Dst);
2561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
257ef44bfb9d0f15ba0391f8346c9f01355fb450a09Ted Kremenek  /// VisitAsmStmt - Transfer function logic for inline asm.
2589c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitAsmStmt(const AsmStmt *A, ExplodedNode *Pred, ExplodedNodeSet &Dst);
2591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2609c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitAsmStmtHelperOutputs(const AsmStmt *A,
26103509aea098772644bf4662dc1c88634818ceeccZhongxing Xu                                 AsmStmt::const_outputs_iterator I,
26203509aea098772644bf4662dc1c88634818ceeccZhongxing Xu                                 AsmStmt::const_outputs_iterator E,
2639c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                 ExplodedNode *Pred, ExplodedNodeSet &Dst);
2641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2659c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitAsmStmtHelperInputs(const AsmStmt *A,
26603509aea098772644bf4662dc1c88634818ceeccZhongxing Xu                                AsmStmt::const_inputs_iterator I,
26703509aea098772644bf4662dc1c88634818ceeccZhongxing Xu                                AsmStmt::const_inputs_iterator E,
2689c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                ExplodedNode *Pred, ExplodedNodeSet &Dst);
269c95ad9ff6e574aecdd759542d5578bc65d586d93Ted Kremenek
270c95ad9ff6e574aecdd759542d5578bc65d586d93Ted Kremenek  /// VisitBlockExpr - Transfer function logic for BlockExprs.
27103509aea098772644bf4662dc1c88634818ceeccZhongxing Xu  void VisitBlockExpr(const BlockExpr *BE, ExplodedNode *Pred,
27203509aea098772644bf4662dc1c88634818ceeccZhongxing Xu                      ExplodedNodeSet &Dst);
2731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
274b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  /// VisitBinaryOperator - Transfer function logic for binary operators.
2759c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitBinaryOperator(const BinaryOperator* B, ExplodedNode *Pred,
2769c378f705405d37f49795d5e915989de774fe11fTed Kremenek                           ExplodedNodeSet &Dst);
277469ecbded3616416ef938ed94a67f86149faf226Ted Kremenek
2781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
279de43424560f1a744de6214dab6bbee28ad8437f5Ted Kremenek  /// VisitCall - Transfer function for function calls.
2809c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitCallExpr(const CallExpr *CE, ExplodedNode *Pred,
2819c378f705405d37f49795d5e915989de774fe11fTed Kremenek                     ExplodedNodeSet &Dst);
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
283b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  /// VisitCast - Transfer function logic for all casts (implicit and explicit).
28403509aea098772644bf4662dc1c88634818ceeccZhongxing Xu  void VisitCast(const CastExpr *CastE, const Expr *Ex, ExplodedNode *Pred,
285892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek                ExplodedNodeSet &Dst);
286e1c2a675e0c089e1f53cbd55d2197a8beaa852aeTed Kremenek
2874f09027385466f1f4c382c80ca77157e2aef97d9Ted Kremenek  /// VisitCompoundLiteralExpr - Transfer function logic for compound literals.
2889c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitCompoundLiteralExpr(const CompoundLiteralExpr *CL,
2899c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                ExplodedNode *Pred, ExplodedNodeSet &Dst);
2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
291892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek  /// Transfer function logic for DeclRefExprs and BlockDeclRefExprs.
2929c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitCommonDeclRefExpr(const Expr *DR, const NamedDecl *D,
2939c378f705405d37f49795d5e915989de774fe11fTed Kremenek                              ExplodedNode *Pred, ExplodedNodeSet &Dst);
29467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek
295b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  /// VisitDeclStmt - Transfer function logic for DeclStmts.
2969c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitDeclStmt(const DeclStmt *DS, ExplodedNode *Pred,
2979c378f705405d37f49795d5e915989de774fe11fTed Kremenek                     ExplodedNodeSet &Dst);
2981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
299b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  /// VisitGuardedExpr - Transfer function logic for ?, __builtin_choose
3009c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitGuardedExpr(const Expr *Ex, const Expr *L, const Expr *R,
3019c378f705405d37f49795d5e915989de774fe11fTed Kremenek                        ExplodedNode *Pred, ExplodedNodeSet &Dst);
30261dfbecd8e6181b2ba42ffb5feede27a2bab3b8aTed Kremenek
3039c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred,
3049c378f705405d37f49795d5e915989de774fe11fTed Kremenek                         ExplodedNodeSet &Dst);
305c4f8706b6539e06a5de153bd72850bb2e0a71456Zhongxing Xu
306b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  /// VisitLogicalExpr - Transfer function logic for '&&', '||'
3079c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred,
3089c378f705405d37f49795d5e915989de774fe11fTed Kremenek                        ExplodedNodeSet &Dst);
3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
310469ecbded3616416ef938ed94a67f86149faf226Ted Kremenek  /// VisitMemberExpr - Transfer function for member expressions.
3119c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitMemberExpr(const MemberExpr *M, ExplodedNode *Pred,
3129c378f705405d37f49795d5e915989de774fe11fTed Kremenek                           ExplodedNodeSet &Dst);
3131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3144beaa9f51b2da57c64740cef2bd1c2fdb0c325d5Ted Kremenek  /// Transfer function logic for ObjCAtSynchronizedStmts.
3154beaa9f51b2da57c64740cef2bd1c2fdb0c325d5Ted Kremenek  void VisitObjCAtSynchronizedStmt(const ObjCAtSynchronizedStmt *S,
3164beaa9f51b2da57c64740cef2bd1c2fdb0c325d5Ted Kremenek                                   ExplodedNode *Pred, ExplodedNodeSet &Dst);
3174beaa9f51b2da57c64740cef2bd1c2fdb0c325d5Ted Kremenek
318892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek  /// Transfer function logic for computing the lvalue of an Objective-C ivar.
3199c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitLvalObjCIvarRefExpr(const ObjCIvarRefExpr *DR, ExplodedNode *Pred,
3209c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                ExplodedNodeSet &Dst);
321af3374187c47acea45706eab6744be6b1c66a856Ted Kremenek
322af3374187c47acea45706eab6744be6b1c66a856Ted Kremenek  /// VisitObjCForCollectionStmt - Transfer function logic for
323af3374187c47acea45706eab6744be6b1c66a856Ted Kremenek  ///  ObjCForCollectionStmt.
3249c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitObjCForCollectionStmt(const ObjCForCollectionStmt *S,
3259c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                  ExplodedNode *Pred, ExplodedNodeSet &Dst);
3261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3274410a935e8d8ee3c903b858bbf74ca24fce629b5Ted Kremenek  void VisitObjCMessage(const ObjCMessage &msg, ExplodedNode *Pred,
3289c378f705405d37f49795d5e915989de774fe11fTed Kremenek                        ExplodedNodeSet &Dst);
3291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33002737ed29d7fff2206f7c7ee958cdf0665e35542Ted Kremenek  /// VisitReturnStmt - Transfer function logic for return statements.
3319c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitReturnStmt(const ReturnStmt *R, ExplodedNode *Pred,
3329c378f705405d37f49795d5e915989de774fe11fTed Kremenek                       ExplodedNodeSet &Dst);
3338ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
3348ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// VisitOffsetOfExpr - Transfer function for offsetof.
3359c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitOffsetOfExpr(const OffsetOfExpr *Ex, ExplodedNode *Pred,
3369c378f705405d37f49795d5e915989de774fe11fTed Kremenek                         ExplodedNodeSet &Dst);
3371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
338f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  /// VisitUnaryExprOrTypeTraitExpr - Transfer function for sizeof.
3399c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *Ex,
3409c378f705405d37f49795d5e915989de774fe11fTed Kremenek                              ExplodedNode *Pred, ExplodedNodeSet &Dst);
3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
342b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  /// VisitUnaryOperator - Transfer function logic for unary operators.
3439c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void VisitUnaryOperator(const UnaryOperator* B, ExplodedNode *Pred,
3449c378f705405d37f49795d5e915989de774fe11fTed Kremenek                          ExplodedNodeSet &Dst);
345bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
34603509aea098772644bf4662dc1c88634818ceeccZhongxing Xu  void VisitCXXThisExpr(const CXXThisExpr *TE, ExplodedNode *Pred,
347bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu                        ExplodedNodeSet & Dst);
348d706434b0231c76fd9acf30060646a7aa8f69aefZhongxing Xu
349d706434b0231c76fd9acf30060646a7aa8f69aefZhongxing Xu  void VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *expr,
350892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek                                   ExplodedNode *Pred, ExplodedNodeSet &Dst) {
351892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek    VisitCXXConstructExpr(expr, 0, Pred, Dst);
352d706434b0231c76fd9acf30060646a7aa8f69aefZhongxing Xu  }
353d706434b0231c76fd9acf30060646a7aa8f69aefZhongxing Xu
3547ce351db56fbce162a3b650518ce05b5c61ebf36Zhongxing Xu  void VisitCXXConstructExpr(const CXXConstructExpr *E, const MemRegion *Dest,
355892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek                             ExplodedNode *Pred, ExplodedNodeSet &Dst);
356950db87e5efe2ff0c7234116929f8637aaf7ae7aZhongxing Xu
357b13453bd8a91f331d0910ca95ad52aa41b52f648Zhongxing Xu  void VisitCXXDestructor(const CXXDestructorDecl *DD,
358b13453bd8a91f331d0910ca95ad52aa41b52f648Zhongxing Xu                          const MemRegion *Dest, const Stmt *S,
359b13453bd8a91f331d0910ca95ad52aa41b52f648Zhongxing Xu                          ExplodedNode *Pred, ExplodedNodeSet &Dst);
360b13453bd8a91f331d0910ca95ad52aa41b52f648Zhongxing Xu
36103509aea098772644bf4662dc1c88634818ceeccZhongxing Xu  void VisitCXXNewExpr(const CXXNewExpr *CNE, ExplodedNode *Pred,
362856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu                       ExplodedNodeSet &Dst);
363856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu
36403509aea098772644bf4662dc1c88634818ceeccZhongxing Xu  void VisitCXXDeleteExpr(const CXXDeleteExpr *CDE, ExplodedNode *Pred,
3656b8513829895e56a7b97e787ea74520bc626512eZhongxing Xu                          ExplodedNodeSet &Dst);
3666b8513829895e56a7b97e787ea74520bc626512eZhongxing Xu
3677ce351db56fbce162a3b650518ce05b5c61ebf36Zhongxing Xu  void VisitAggExpr(const Expr *E, const MemRegion *Dest, ExplodedNode *Pred,
3687b71c1977cccafa23f9ecb3b0b22199e61ae634cZhongxing Xu                    ExplodedNodeSet &Dst);
3697b71c1977cccafa23f9ecb3b0b22199e61ae634cZhongxing Xu
370bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu  /// Create a C++ temporary object for an rvalue.
371eea72a925f294225391ecec876a342771c09b635Ted Kremenek  void CreateCXXTemporaryObject(const MaterializeTemporaryExpr *ME,
372eea72a925f294225391ecec876a342771c09b635Ted Kremenek                                ExplodedNode *Pred,
373bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu                                ExplodedNodeSet &Dst);
374bc37b8dd9914e02580f531fa6e5e72be34d9675eZhongxing Xu
3758e18c1b840882d26039503629d7e4ad4822f3bdaZhongxing Xu  /// Synthesize CXXThisRegion.
3769dc84c9455df2a77195147d0210c915dc1775a88Zhongxing Xu  const CXXThisRegion *getCXXThisRegion(const CXXRecordDecl *RD,
3778e18c1b840882d26039503629d7e4ad4822f3bdaZhongxing Xu                                        const StackFrameContext *SFC);
3788e18c1b840882d26039503629d7e4ad4822f3bdaZhongxing Xu
37932303020d0f1a21cbcab65ae0c69a4218dc8f0fbZhongxing Xu  const CXXThisRegion *getCXXThisRegion(const CXXMethodDecl *decl,
38032303020d0f1a21cbcab65ae0c69a4218dc8f0fbZhongxing Xu                                        const StackFrameContext *frameCtx);
38132303020d0f1a21cbcab65ae0c69a4218dc8f0fbZhongxing Xu
382b17b1b3cc2b0d4d3b263b9384571bbc7f3995771Zhongxing Xu  /// Evaluate arguments with a work list algorithm.
3839c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek  void evalArguments(ConstExprIterator AI, ConstExprIterator AE,
384b17b1b3cc2b0d4d3b263b9384571bbc7f3995771Zhongxing Xu                     const FunctionProtoType *FnType,
38582c63bfa0c5130e0cf274c1974b6157ebefc04feMarcin Swiderski                     ExplodedNode *Pred, ExplodedNodeSet &Dst,
38682c63bfa0c5130e0cf274c1974b6157ebefc04feMarcin Swiderski                     bool FstArgAsLValue = false);
387b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek
388b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  /// Evaluate callee expression (for a function call).
389b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  void evalCallee(const CallExpr *callExpr, const ExplodedNodeSet &src,
390b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek                  ExplodedNodeSet &dest);
3916a02b609c2e23b28d24f9db4c8006137c6b55ae4Marcin Swiderski
3929c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek  /// evalEagerlyAssume - Given the nodes in 'Src', eagerly assume symbolic
39348af2a9c1ed3259512f2d1431720add1fbe8fb5fTed Kremenek  ///  expressions of the form 'x != 0' and generate new nodes (stored in Dst)
39448af2a9c1ed3259512f2d1431720add1fbe8fb5fTed Kremenek  ///  with those assumptions.
3959c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void evalEagerlyAssume(ExplodedNodeSet &Dst, ExplodedNodeSet &Src,
39603509aea098772644bf4662dc1c88634818ceeccZhongxing Xu                         const Expr *Ex);
3976c7511db998817e64f2e124013e7d7c9a430c580Ted Kremenek
3986c7511db998817e64f2e124013e7d7c9a430c580Ted Kremenek  std::pair<const ProgramPointTag *, const ProgramPointTag*>
3996c7511db998817e64f2e124013e7d7c9a430c580Ted Kremenek    getEagerlyAssumeTags();
4001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4019c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek  SVal evalMinus(SVal X) {
4029c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek    return X.isValid() ? svalBuilder.evalMinus(cast<NonLoc>(X)) : X;
403b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  }
4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4059c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek  SVal evalComplement(SVal X) {
4069c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek    return X.isValid() ? svalBuilder.evalComplement(cast<NonLoc>(X)) : X;
40790e420321f60860f4c4e7a68ca9f7567824b46ecTed Kremenek  }
408248072a8b9cd956c4ac63172fc2af09790f7c6a9Zhongxing Xu
4091670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenekpublic:
4101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41118c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  SVal evalBinOp(const ProgramState *state, BinaryOperator::Opcode op,
412cd8f6ac9b613e1fe962ebf9c87d822ce765275e6Ted Kremenek                 NonLoc L, NonLoc R, QualType T) {
4139c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek    return svalBuilder.evalBinOpNN(state, op, L, R, T);
4146297a8ec313c722db50f686fd190842b7ea91118Ted Kremenek  }
41510c16657eec144def180ee53d1e0249c9ed2b3b5Ted Kremenek
41618c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  SVal evalBinOp(const ProgramState *state, BinaryOperator::Opcode op,
417cd8f6ac9b613e1fe962ebf9c87d822ce765275e6Ted Kremenek                 NonLoc L, SVal R, QualType T) {
4189c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek    return R.isValid() ? svalBuilder.evalBinOpNN(state,op,L, cast<NonLoc>(R), T) : R;
419b640b3b5dfccaf259967cb2cb6755c9aa20d4423Ted Kremenek  }
4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42118c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  SVal evalBinOp(const ProgramState *ST, BinaryOperator::Opcode Op,
422ff4264dae31cf42807b64ecc114906b0b835690aTed Kremenek                 SVal LHS, SVal RHS, QualType T) {
4239c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek    return svalBuilder.evalBinOp(ST, Op, LHS, RHS, T);
424ff4264dae31cf42807b64ecc114906b0b835690aTed Kremenek  }
4255b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek
4261670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenekprotected:
4279c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void evalObjCMessage(ExplodedNodeSet &Dst, const ObjCMessage &msg,
428500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose                       ExplodedNode *Pred, const ProgramState *state);
4291670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek
430e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose  const ProgramState *invalidateArguments(const ProgramState *State,
431e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose                                          const CallOrObjCMessage &Call,
432e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose                                          const LocationContext *LC);
433e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
43418c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  const ProgramState *MarkBranch(const ProgramState *St, const Stmt *Terminator,
4351670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenek                            bool branchTaken);
4361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4379c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek  /// evalBind - Handle the semantics of binding a value to a specific location.
4389c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek  ///  This method is used by evalStore, VisitDeclStmt, and others.
4399c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void evalBind(ExplodedNodeSet &Dst, const Stmt *StoreE, ExplodedNode *Pred,
44093bd5ca766c4d7906878f4ffe76ce1b2080e540bJordy Rose                SVal location, SVal Val, bool atDeclInit = false);
4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4421670e403c48f3af4fceff3f6773a0e1cfc6c4eb3Ted Kremenekpublic:
443b4b817d704287836b52b34369009e682f208aa2bTed Kremenek  // FIXME: 'tag' should be removed, and a LocationContext should be used
444b4b817d704287836b52b34369009e682f208aa2bTed Kremenek  // instead.
445834f9de3d3d76986d09f41725a70ba45a3e2aecdZhanyong Wan  // FIXME: Comment on the meaning of the arguments, when 'St' may not
446834f9de3d3d76986d09f41725a70ba45a3e2aecdZhanyong Wan  // be the same as Pred->state, and when 'location' may not be the
447834f9de3d3d76986d09f41725a70ba45a3e2aecdZhanyong Wan  // same as state->getLValue(Ex).
448834f9de3d3d76986d09f41725a70ba45a3e2aecdZhanyong Wan  /// Simulate a read of the result of Ex.
4499c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void evalLoad(ExplodedNodeSet &Dst, const Expr *Ex, ExplodedNode *Pred,
45018c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                const ProgramState *St, SVal location, const ProgramPointTag *tag = 0,
451652be346f74feba027bcbdeb6a3e3f4755a0e62cZhongxing Xu                QualType LoadTy = QualType());
4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
453b4b817d704287836b52b34369009e682f208aa2bTed Kremenek  // FIXME: 'tag' should be removed, and a LocationContext should be used
454b4b817d704287836b52b34369009e682f208aa2bTed Kremenek  // instead.
4559c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void evalStore(ExplodedNodeSet &Dst, const Expr *AssignE, const Expr *StoreE,
45618c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                 ExplodedNode *Pred, const ProgramState *St, SVal TargetLV, SVal Val,
457ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek                 const ProgramPointTag *tag = 0);
458834f9de3d3d76986d09f41725a70ba45a3e2aecdZhanyong Wanprivate:
4599c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void evalLoadCommon(ExplodedNodeSet &Dst, const Expr *Ex, ExplodedNode *Pred,
46018c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                      const ProgramState *St, SVal location, const ProgramPointTag *tag,
461852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek                      QualType LoadTy);
462852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek
463852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek  // FIXME: 'tag' should be removed, and a LocationContext should be used
464852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek  // instead.
4659c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void evalLocation(ExplodedNodeSet &Dst, const Stmt *S, ExplodedNode *Pred,
46618c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                    const ProgramState *St, SVal location,
467ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek                    const ProgramPointTag *tag, bool isLoad);
4681c625f25055331bf76ab5479a8060d2b0f61e8b8Zhongxing Xu
4691c625f25055331bf76ab5479a8060d2b0f61e8b8Zhongxing Xu  bool InlineCall(ExplodedNodeSet &Dst, const CallExpr *CE, ExplodedNode *Pred);
470e5cfd52a3a5d4bb46f77323fa8fa0b973fcde7bcTed Kremenek
471e5cfd52a3a5d4bb46f77323fa8fa0b973fcde7bcTed Kremenek
472e5cfd52a3a5d4bb46f77323fa8fa0b973fcde7bcTed Kremenekpublic:
473e5cfd52a3a5d4bb46f77323fa8fa0b973fcde7bcTed Kremenek  /// Returns true if calling the specific function or method would possibly
474e5cfd52a3a5d4bb46f77323fa8fa0b973fcde7bcTed Kremenek  /// cause global variables to be invalidated.
475e5cfd52a3a5d4bb46f77323fa8fa0b973fcde7bcTed Kremenek  bool doesInvalidateGlobals(const CallOrObjCMessage &callOrMessage) const;
476e5cfd52a3a5d4bb46f77323fa8fa0b973fcde7bcTed Kremenek
477b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek};
4781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47965423aeb996a296cf2964f136ce4a4a937bd1687Zhongxing Xu} // end ento namespace
4805a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
481c0c3f5dbc9e78aa53a86c7d5e3eeda23ddad93d6Ted Kremenek} // end clang namespace
482c0c3f5dbc9e78aa53a86c7d5e3eeda23ddad93d6Ted Kremenek
483d065d6080f0620bb80b933f3f5d52d37bb2ea770Ted Kremenek#endif
484