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