ProgramState.h revision d4fe57f7f7a8793227effc1274d70ec44cee9a4f
1ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek//== ProgramState.h - Path-sensitive "State" for tracking values -*- C++ -*--=// 2ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek// 3ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek// The LLVM Compiler Infrastructure 4ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek// 5ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek// This file is distributed under the University of Illinois Open Source 6ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek// License. See LICENSE.TXT for details. 7ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek// 8ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek//===----------------------------------------------------------------------===// 9ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek// 10ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek// This file defines SymbolRef, ExprBindKey, and ProgramState*. 11ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek// 12ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek//===----------------------------------------------------------------------===// 13ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 14ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#ifndef LLVM_CLANG_GR_VALUESTATE_H 15ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#define LLVM_CLANG_GR_VALUESTATE_H 16ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 17ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#include "clang/Basic/LLVM.h" 18ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h" 19ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/Environment.h" 20ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/Store.h" 21ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h" 228bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState_Fwd.h" 23ceac1d6e0521161adf7ac9834b1a7ad79d73fea4Anna Zaks#include "clang/StaticAnalyzer/Core/PathSensitive/TaintTag.h" 24ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#include "llvm/ADT/PointerIntPair.h" 25ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#include "llvm/ADT/FoldingSet.h" 26ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#include "llvm/ADT/ImmutableMap.h" 27ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 28ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremeneknamespace llvm { 29ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekclass APSInt; 30ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekclass BumpPtrAllocator; 31ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 32ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 33ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremeneknamespace clang { 34ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekclass ASTContext; 35ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 36ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremeneknamespace ento { 37ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 38740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CallEvent; 39972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseclass CallEventManager; 408bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek 41ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektypedef ConstraintManager* (*ConstraintManagerCreator)(ProgramStateManager&, 42ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SubEngine&); 43ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektypedef StoreManager* (*StoreManagerCreator)(ProgramStateManager&); 44ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 45ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek//===----------------------------------------------------------------------===// 46ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek// ProgramStateTrait - Traits used by the Generic Data Map of a ProgramState. 47ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek//===----------------------------------------------------------------------===// 48ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 49ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektemplate <typename T> struct ProgramStatePartialTrait; 50ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 51ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektemplate <typename T> struct ProgramStateTrait { 52ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typedef typename T::data_type data_type; 53ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek static inline void *MakeVoidPtr(data_type D) { return (void*) D; } 54ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek static inline data_type MakeData(void *const* P) { 55ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return P ? (data_type) *P : (data_type) 0; 56ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 57ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek}; 58ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 592d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks/// \class Stores the dynamic type information. 602d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks/// Information about type of an object at runtime. This is used by dynamic 612d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks/// dispatch implementation. 622d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaksclass DynamicTypeInfo { 632d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks QualType T; 642d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks 652d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zakspublic: 662d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks DynamicTypeInfo() : T(QualType()) {} 672d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks DynamicTypeInfo(QualType WithType) : T(WithType) {} 682d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks QualType getType() {return T;} 69148fee988e32efcad45ecf7b3bf714880c657ddaAnna Zaks void Profile(llvm::FoldingSetNodeID &ID) const { 70148fee988e32efcad45ecf7b3bf714880c657ddaAnna Zaks T.Profile(ID); 71148fee988e32efcad45ecf7b3bf714880c657ddaAnna Zaks } 72148fee988e32efcad45ecf7b3bf714880c657ddaAnna Zaks bool operator==(const DynamicTypeInfo &X) const { 73148fee988e32efcad45ecf7b3bf714880c657ddaAnna Zaks return T == X.T; 74148fee988e32efcad45ecf7b3bf714880c657ddaAnna Zaks } 752d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks}; 762d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks 775f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks/// \class ProgramState 78ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek/// ProgramState - This class encapsulates: 79ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek/// 80ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek/// 1. A mapping from expressions to values (Environment) 81ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek/// 2. A mapping from locations to values (Store) 82ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek/// 3. Constraints on symbolic values (GenericDataMap) 83ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek/// 84ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek/// Together these represent the "abstract state" of a program. 85ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek/// 86ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek/// ProgramState is intended to be used as a functional object; that is, 87ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek/// once it is created and made "persistent" in a FoldingSet, its 88ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek/// values will never change. 89ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekclass ProgramState : public llvm::FoldingSetNode { 90ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekpublic: 91ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typedef llvm::ImmutableSet<llvm::APSInt*> IntSetTy; 92ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typedef llvm::ImmutableMap<void*, void*> GenericDataMap; 93ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 94ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekprivate: 95ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void operator=(const ProgramState& R) const; // Do not implement. 96ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 97ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek friend class ProgramStateManager; 98ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek friend class ExplodedGraph; 99ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek friend class ExplodedNode; 100ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 101ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ProgramStateManager *stateMgr; 102ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek Environment Env; // Maps a Stmt to its current SVal. 103ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek Store store; // Maps a location to its current value. 104ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek GenericDataMap GDM; // Custom data stored by a client of this class. 105ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek unsigned refCount; 106ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 107ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// makeWithStore - Return a ProgramState with the same values as the current 108ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// state with the exception of using the specified Store. 1098bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef makeWithStore(const StoreRef &store) const; 110ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 111ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void setStore(const StoreRef &storeRef); 112ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 113ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekpublic: 114ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// This ctor is used when creating the first ProgramState object. 115ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ProgramState(ProgramStateManager *mgr, const Environment& env, 116ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek StoreRef st, GenericDataMap gdm); 117ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 118ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Copy ctor - We must explicitly define this or else the "Next" ptr 119ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// in FoldingSetNode will also get copied. 120ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ProgramState(const ProgramState &RHS); 121ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 122ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ~ProgramState(); 123ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 124ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Return the ProgramStateManager associated with this state. 125ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ProgramStateManager &getStateManager() const { return *stateMgr; } 126ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 127ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// getEnvironment - Return the environment associated with this state. 128ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// The environment is the mapping from expressions to values. 129ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const Environment& getEnvironment() const { return Env; } 130ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 131ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Return the store associated with this state. The store 132ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// is a mapping from locations to values. 133ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek Store getStore() const { return store; } 134ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 135ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 136ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// getGDM - Return the generic data map associated with this state. 137ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek GenericDataMap getGDM() const { return GDM; } 138ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 139ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void setGDM(GenericDataMap gdm) { GDM = gdm; } 140ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 141ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Profile - Profile the contents of a ProgramState object for use in a 142ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// FoldingSet. Two ProgramState objects are considered equal if they 143ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// have the same Environment, Store, and GenericDataMap. 144a5888f61be9f8d76e9b48a453dbced50523bd2e0Argyrios Kyrtzidis static void Profile(llvm::FoldingSetNodeID& ID, const ProgramState *V) { 145ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek V->Env.Profile(ID); 146ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ID.AddPointer(V->store); 147ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek V->GDM.Profile(ID); 148ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 149ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 150ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Profile - Used to profile the contents of this object for inclusion 151ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// in a FoldingSet. 152ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void Profile(llvm::FoldingSetNodeID& ID) const { 153ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek Profile(ID, this); 154ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 155ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 156ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek BasicValueFactory &getBasicVals() const; 157ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SymbolManager &getSymbolManager() const; 158ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 159ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek //==---------------------------------------------------------------------==// 160ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Constraints on values. 161ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek //==---------------------------------------------------------------------==// 162ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // 163ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Each ProgramState records constraints on symbolic values. These constraints 164ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // are managed using the ConstraintManager associated with a ProgramStateManager. 165ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // As constraints gradually accrue on symbolic values, added constraints 166ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // may conflict and indicate that a state is infeasible (as no real values 167ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // could satisfy all the constraints). This is the principal mechanism 168ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // for modeling path-sensitivity in ExprEngine/ProgramState. 169ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // 170ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Various "assume" methods form the interface for adding constraints to 171ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // symbolic values. A call to 'assume' indicates an assumption being placed 172ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // on one or symbolic values. 'assume' methods take the following inputs: 173ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // 174ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // (1) A ProgramState object representing the current state. 175ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // 176ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // (2) The assumed constraint (which is specific to a given "assume" method). 177ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // 178ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // (3) A binary value "Assumption" that indicates whether the constraint is 179ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // assumed to be true or false. 180ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // 181ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // The output of "assume*" is a new ProgramState object with the added constraints. 182ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // If no new state is feasible, NULL is returned. 183ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // 184ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 1858bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef assume(DefinedOrUnknownSVal cond, bool assumption) const; 186ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 187ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// This method assumes both "true" and "false" for 'cond', and 188ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// returns both corresponding states. It's shorthand for doing 189ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// 'assume' twice. 1908bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek std::pair<ProgramStateRef , ProgramStateRef > 191ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek assume(DefinedOrUnknownSVal cond) const; 192ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 1938bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef assumeInBound(DefinedOrUnknownSVal idx, 194ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek DefinedOrUnknownSVal upperBound, 195af5f550de34525b27f0ff31dafce792caf8158b6Anna Zaks bool assumption, 196af5f550de34525b27f0ff31dafce792caf8158b6Anna Zaks QualType IndexType = QualType()) const; 197ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 1985f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks /// Utility method for getting regions. 199ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const VarRegion* getRegion(const VarDecl *D, const LocationContext *LC) const; 200ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 201ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek //==---------------------------------------------------------------------==// 202ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Binding and retrieving values to/from the environment and symbolic store. 203ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek //==---------------------------------------------------------------------==// 204ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 205ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// BindCompoundLiteral - Return the state that has the bindings currently 206ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// in this state plus the bindings for the CompoundLiteral. 2078bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef bindCompoundLiteral(const CompoundLiteralExpr *CL, 208ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const LocationContext *LC, 209ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SVal V) const; 210ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 211ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Create a new state by binding the value 'V' to the statement 'S' in the 212ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// state's environment. 2138bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef BindExpr(const Stmt *S, const LocationContext *LCtx, 2145eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek SVal V, bool Invalidate = true) const; 215ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 216ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Create a new state by binding the value 'V' and location 'locaton' to the 217ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// statement 'S' in the state's environment. 2188bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef bindExprAndLocation(const Stmt *S, 2195eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek const LocationContext *LCtx, 2205eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek SVal location, SVal V) const; 221ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 2228bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef bindDecl(const VarRegion *VR, SVal V) const; 223ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 2248bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef bindDeclWithNoInit(const VarRegion *VR) const; 225ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 2268bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef bindLoc(Loc location, SVal V) const; 227ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 2288bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef bindLoc(SVal location, SVal V) const; 229ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 2308bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef bindDefault(SVal loc, SVal V) const; 231ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 2328bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef unbindLoc(Loc LV) const; 233ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 234ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// invalidateRegions - Returns the state with bindings for the given regions 235ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// cleared from the store. The regions are provided as a continuous array 236ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// from Begin to End. Optionally invalidates global regions as well. 2378bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef invalidateRegions(ArrayRef<const MemRegion *> Regions, 238eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const Expr *E, unsigned BlockCount, 2393133f79cf451e6302dd05262b4bb53a3e4fd6300Ted Kremenek const LocationContext *LCtx, 240eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks StoreManager::InvalidatedSymbols *IS = 0, 241740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const CallEvent *Call = 0) const; 242ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 243ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// enterStackFrame - Returns the state for entry to the given stack frame, 244ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// preserving the current state. 245e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose ProgramStateRef enterStackFrame(const CallEvent &Call, 246e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose const StackFrameContext *CalleeCtx) const; 247ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 248ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Get the lvalue for a variable reference. 249ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek Loc getLValue(const VarDecl *D, const LocationContext *LC) const; 250ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 251ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek Loc getLValue(const CompoundLiteralExpr *literal, 252ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const LocationContext *LC) const; 253ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 254ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Get the lvalue for an ivar reference. 255ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SVal getLValue(const ObjCIvarDecl *decl, SVal base) const; 256ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 257ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Get the lvalue for a field reference. 258ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SVal getLValue(const FieldDecl *decl, SVal Base) const; 259ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 2603a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Rose /// Get the lvalue for an indirect field reference. 2613a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Rose SVal getLValue(const IndirectFieldDecl *decl, SVal Base) const; 2623a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Rose 263ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Get the lvalue for an array index. 264ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SVal getLValue(QualType ElementType, SVal Idx, SVal Base) const; 265ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 266ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const llvm::APSInt *getSymVal(SymbolRef sym) const; 267ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 268ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Returns the SVal bound to the statement 'S' in the state's environment. 2695eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek SVal getSVal(const Stmt *S, const LocationContext *LCtx, 2705eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek bool useOnlyDirectBindings = false) const; 271ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 2725eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek SVal getSValAsScalarOrLoc(const Stmt *Ex, const LocationContext *LCtx) const; 273ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 2744335a48214dcbb258e08c8867c45648e25edb2ecAnna Zaks /// \brief Return the value bound to the specified location. 2754335a48214dcbb258e08c8867c45648e25edb2ecAnna Zaks /// Returns UnknownVal() if none found. 276ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SVal getSVal(Loc LV, QualType T = QualType()) const; 277ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 278ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Returns the "raw" SVal bound to LV before any value simplfication. 279ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SVal getRawSVal(Loc LV, QualType T= QualType()) const; 280ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 2814335a48214dcbb258e08c8867c45648e25edb2ecAnna Zaks /// \brief Return the value bound to the specified location. 2824335a48214dcbb258e08c8867c45648e25edb2ecAnna Zaks /// Returns UnknownVal() if none found. 283ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SVal getSVal(const MemRegion* R) const; 284ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 285ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SVal getSValAsScalarOrLoc(const MemRegion *R) const; 286ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 2875f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks /// \brief Visits the symbols reachable from the given SVal using the provided 2885f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks /// SymbolVisitor. 2895f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks /// 2905f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks /// This is a convenience API. Consider using ScanReachableSymbols class 2915f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks /// directly when making multiple scans on the same state with the same 2925f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks /// visitor to avoid repeated initialization cost. 2935f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks /// \sa ScanReachableSymbols 294ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek bool scanReachableSymbols(SVal val, SymbolVisitor& visitor) const; 295ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 2965f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks /// \brief Visits the symbols reachable from the SVals in the given range 2975f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks /// using the provided SymbolVisitor. 298ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek bool scanReachableSymbols(const SVal *I, const SVal *E, 299ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SymbolVisitor &visitor) const; 300ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 3015f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks /// \brief Visits the symbols reachable from the regions in the given 3025f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks /// MemRegions range using the provided SymbolVisitor. 303ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek bool scanReachableSymbols(const MemRegion * const *I, 304ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const MemRegion * const *E, 305ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SymbolVisitor &visitor) const; 306ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 307ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template <typename CB> CB scanReachableSymbols(SVal val) const; 308ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template <typename CB> CB scanReachableSymbols(const SVal *beg, 309ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const SVal *end) const; 310ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 311ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template <typename CB> CB 312ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek scanReachableSymbols(const MemRegion * const *beg, 313ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const MemRegion * const *end) const; 314ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 315ceac1d6e0521161adf7ac9834b1a7ad79d73fea4Anna Zaks /// Create a new state in which the statement is marked as tainted. 3168bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef addTaint(const Stmt *S, const LocationContext *LCtx, 317ceac1d6e0521161adf7ac9834b1a7ad79d73fea4Anna Zaks TaintTagType Kind = TaintTagGeneric) const; 318ceac1d6e0521161adf7ac9834b1a7ad79d73fea4Anna Zaks 319ceac1d6e0521161adf7ac9834b1a7ad79d73fea4Anna Zaks /// Create a new state in which the symbol is marked as tainted. 3208bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef addTaint(SymbolRef S, 321ceac1d6e0521161adf7ac9834b1a7ad79d73fea4Anna Zaks TaintTagType Kind = TaintTagGeneric) const; 322ceac1d6e0521161adf7ac9834b1a7ad79d73fea4Anna Zaks 32328fd98d66dab4569316de2b5881d91b534a42461Anna Zaks /// Create a new state in which the region symbol is marked as tainted. 3248bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef addTaint(const MemRegion *R, 32528fd98d66dab4569316de2b5881d91b534a42461Anna Zaks TaintTagType Kind = TaintTagGeneric) const; 32628fd98d66dab4569316de2b5881d91b534a42461Anna Zaks 327ceac1d6e0521161adf7ac9834b1a7ad79d73fea4Anna Zaks /// Check if the statement is tainted in the current state. 3285eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek bool isTainted(const Stmt *S, const LocationContext *LCtx, 3295eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek TaintTagType Kind = TaintTagGeneric) const; 330ceac1d6e0521161adf7ac9834b1a7ad79d73fea4Anna Zaks bool isTainted(SVal V, TaintTagType Kind = TaintTagGeneric) const; 3319f03b62036a7abc0a227b17f4a49b9eefced9450Anna Zaks bool isTainted(SymbolRef Sym, TaintTagType Kind = TaintTagGeneric) const; 332dcf06fa1fbb9c018e152629ef3f3fa7b1acffe7aAnna Zaks bool isTainted(const MemRegion *Reg, TaintTagType Kind=TaintTagGeneric) const; 333ceac1d6e0521161adf7ac9834b1a7ad79d73fea4Anna Zaks 334c7ecc43c33a21b82c49664910b19fcc1f555aa51Anna Zaks /// \brief Get dynamic type information for a region. 3352d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks DynamicTypeInfo getDynamicTypeInfo(const MemRegion *Reg) const; 336c7ecc43c33a21b82c49664910b19fcc1f555aa51Anna Zaks 337d4fe57f7f7a8793227effc1274d70ec44cee9a4fAnna Zaks /// \brief Set dynamic type information of the region; return the new state. 338d4fe57f7f7a8793227effc1274d70ec44cee9a4fAnna Zaks ProgramStateRef setDynamicTypeInfo(const MemRegion *Reg, 339c7ecc43c33a21b82c49664910b19fcc1f555aa51Anna Zaks DynamicTypeInfo NewTy) const; 340c7ecc43c33a21b82c49664910b19fcc1f555aa51Anna Zaks 341d4fe57f7f7a8793227effc1274d70ec44cee9a4fAnna Zaks /// \brief Set dynamic type information of the region; return the new state. 342d4fe57f7f7a8793227effc1274d70ec44cee9a4fAnna Zaks ProgramStateRef setDynamicTypeInfo(const MemRegion *Reg, 343c7ecc43c33a21b82c49664910b19fcc1f555aa51Anna Zaks QualType NewTy) const { 344d4fe57f7f7a8793227effc1274d70ec44cee9a4fAnna Zaks return setDynamicTypeInfo(Reg, DynamicTypeInfo(NewTy)); 345c7ecc43c33a21b82c49664910b19fcc1f555aa51Anna Zaks } 3462d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks 347ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek //==---------------------------------------------------------------------==// 348ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Accessing the Generic Data Map (GDM). 349ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek //==---------------------------------------------------------------------==// 350ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 351ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void *const* FindGDM(void *K) const; 352ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 353ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template<typename T> 3548bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef add(typename ProgramStateTrait<T>::key_type K) const; 355ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 356ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template <typename T> 357ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::data_type 358ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek get() const { 359ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return ProgramStateTrait<T>::MakeData(FindGDM(ProgramStateTrait<T>::GDMIndex())); 360ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 361ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 362ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template<typename T> 363ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::lookup_type 364ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek get(typename ProgramStateTrait<T>::key_type key) const { 365ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void *const* d = FindGDM(ProgramStateTrait<T>::GDMIndex()); 366ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return ProgramStateTrait<T>::Lookup(ProgramStateTrait<T>::MakeData(d), key); 367ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 368ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 369ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template <typename T> 370ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::context_type get_context() const; 371ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 372ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 373ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template<typename T> 3748bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef remove(typename ProgramStateTrait<T>::key_type K) const; 375ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 376ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template<typename T> 3778bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef remove(typename ProgramStateTrait<T>::key_type K, 378ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::context_type C) const; 379ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template <typename T> 3808bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef remove() const; 381ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 382ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template<typename T> 3838bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef set(typename ProgramStateTrait<T>::data_type D) const; 384ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 385ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template<typename T> 3868bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef set(typename ProgramStateTrait<T>::key_type K, 387ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::value_type E) const; 388ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 389ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template<typename T> 3908bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef set(typename ProgramStateTrait<T>::key_type K, 391ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::value_type E, 392ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::context_type C) const; 393ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 394ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template<typename T> 395ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek bool contains(typename ProgramStateTrait<T>::key_type key) const { 396ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void *const* d = FindGDM(ProgramStateTrait<T>::GDMIndex()); 397ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return ProgramStateTrait<T>::Contains(ProgramStateTrait<T>::MakeData(d), key); 398ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 399ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 400ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Pretty-printing. 4015eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek void print(raw_ostream &Out, const char *nl = "\n", 402ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const char *sep = "") const; 4035eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek void printDOT(raw_ostream &Out) const; 404be97b7edb112520d764c24e8b9a159cdc692bcb6Anna Zaks void printTaint(raw_ostream &Out, const char *nl = "\n", 405be97b7edb112520d764c24e8b9a159cdc692bcb6Anna Zaks const char *sep = "") const; 406ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 407d0167853f46cc78787b06255a44f9dcedd04a8ecAnna Zaks void dump() const; 408be97b7edb112520d764c24e8b9a159cdc692bcb6Anna Zaks void dumpTaint() const; 409d0167853f46cc78787b06255a44f9dcedd04a8ecAnna Zaks 410ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekprivate: 411a5888f61be9f8d76e9b48a453dbced50523bd2e0Argyrios Kyrtzidis friend void ProgramStateRetain(const ProgramState *state); 412a5888f61be9f8d76e9b48a453dbced50523bd2e0Argyrios Kyrtzidis friend void ProgramStateRelease(const ProgramState *state); 413ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 4148bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef 415537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose invalidateRegionsImpl(ArrayRef<const MemRegion *> Regions, 416537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose const Expr *E, unsigned BlockCount, 4173133f79cf451e6302dd05262b4bb53a3e4fd6300Ted Kremenek const LocationContext *LCtx, 418537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose StoreManager::InvalidatedSymbols &IS, 419740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const CallEvent *Call) const; 420ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek}; 421ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 422ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek//===----------------------------------------------------------------------===// 423ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek// ProgramStateManager - Factory object for ProgramStates. 424ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek//===----------------------------------------------------------------------===// 425ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 426ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekclass ProgramStateManager { 427ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek friend class ProgramState; 428a5888f61be9f8d76e9b48a453dbced50523bd2e0Argyrios Kyrtzidis friend void ProgramStateRelease(const ProgramState *state); 429ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekprivate: 430ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Eng - The SubEngine that owns this state manager. 431ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SubEngine *Eng; /* Can be null. */ 432ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 433ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek EnvironmentManager EnvMgr; 4346f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<StoreManager> StoreMgr; 4356f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ConstraintManager> ConstraintMgr; 436ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 437ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ProgramState::GenericDataMap::Factory GDMFactory; 438ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 439ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typedef llvm::DenseMap<void*,std::pair<void*,void (*)(void*)> > GDMContextsTy; 440ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek GDMContextsTy GDMContexts; 441ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 442ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// StateSet - FoldingSet containing all the states created for analyzing 443ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// a particular function. This is used to unique states. 444ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek llvm::FoldingSet<ProgramState> StateSet; 445ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 446ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Object that manages the data for all created SVals. 4476f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<SValBuilder> svalBuilder; 448ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 449972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose /// Manages memory for created CallEvents. 450972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose OwningPtr<CallEventManager> CallEventMgr; 451972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 452ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// A BumpPtrAllocator to allocate states. 453ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek llvm::BumpPtrAllocator &Alloc; 454ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 455ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// A vector of ProgramStates that we can reuse. 456ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek std::vector<ProgramState *> freeStates; 457ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 458ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekpublic: 459ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ProgramStateManager(ASTContext &Ctx, 460ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek StoreManagerCreator CreateStoreManager, 461ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ConstraintManagerCreator CreateConstraintManager, 462ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek llvm::BumpPtrAllocator& alloc, 463972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose SubEngine &subeng); 464ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 465ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ~ProgramStateManager(); 466ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 4678bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef getInitialState(const LocationContext *InitLoc); 468ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 469ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ASTContext &getContext() { return svalBuilder->getContext(); } 470ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const ASTContext &getContext() const { return svalBuilder->getContext(); } 471ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 472ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek BasicValueFactory &getBasicVals() { 473ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return svalBuilder->getBasicValueFactory(); 474ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 475ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const BasicValueFactory& getBasicVals() const { 476ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return svalBuilder->getBasicValueFactory(); 477ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 478ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 479ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SValBuilder &getSValBuilder() { 480ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return *svalBuilder; 481ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 482ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 483ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SymbolManager &getSymbolManager() { 484ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return svalBuilder->getSymbolManager(); 485ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 486ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const SymbolManager &getSymbolManager() const { 487ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return svalBuilder->getSymbolManager(); 488ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 489ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 490ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek llvm::BumpPtrAllocator& getAllocator() { return Alloc; } 491ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 492ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek MemRegionManager& getRegionManager() { 493ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return svalBuilder->getRegionManager(); 494ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 495ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const MemRegionManager& getRegionManager() const { 496ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return svalBuilder->getRegionManager(); 497ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 498ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 499972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose CallEventManager &getCallEventManager() { return *CallEventMgr; } 500972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 501ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek StoreManager& getStoreManager() { return *StoreMgr; } 502ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ConstraintManager& getConstraintManager() { return *ConstraintMgr; } 503ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SubEngine* getOwningEngine() { return Eng; } 504ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 5058bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef removeDeadBindings(ProgramStateRef St, 506ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const StackFrameContext *LCtx, 507ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SymbolReaper& SymReaper); 508ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 509ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// Marshal a new state for the callee in another translation unit. 510ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek /// 'state' is owned by the caller's engine. 5118bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef MarshalState(ProgramStateRef state, const StackFrameContext *L); 512ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 513ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekpublic: 514ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 515ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek SVal ArrayToPointer(Loc Array) { 516ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return StoreMgr->ArrayToPointer(Array); 517ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 518ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 519ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Methods that manipulate the GDM. 5208bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef addGDM(ProgramStateRef St, void *Key, void *Data); 5218bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef removeGDM(ProgramStateRef state, void *Key); 522ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 523ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Methods that query & manipulate the Store. 524ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 5258bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek void iterBindings(ProgramStateRef state, StoreManager::BindingsHandler& F) { 526ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek StoreMgr->iterBindings(state->getStore(), F); 527ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 528ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 5298bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef getPersistentState(ProgramState &Impl); 5308bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef getPersistentStateWithGDM(ProgramStateRef FromState, 5318bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef GDMState); 532ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 5338bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek bool haveEqualEnvironments(ProgramStateRef S1, ProgramStateRef S2) { 534ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return S1->Env == S2->Env; 535ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 536ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 5378bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek bool haveEqualStores(ProgramStateRef S1, ProgramStateRef S2) { 538ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return S1->store == S2->store; 539ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 540ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 541ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek //==---------------------------------------------------------------------==// 542ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Generic Data Map methods. 543ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek //==---------------------------------------------------------------------==// 544ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // 545ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // ProgramStateManager and ProgramState support a "generic data map" that allows 546ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // different clients of ProgramState objects to embed arbitrary data within a 547ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // ProgramState object. The generic data map is essentially an immutable map 548ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // from a "tag" (that acts as the "key" for a client) and opaque values. 549ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Tags/keys and values are simply void* values. The typical way that clients 550ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // generate unique tags are by taking the address of a static variable. 551ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Clients are responsible for ensuring that data values referred to by a 552ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // the data pointer are immutable (and thus are essentially purely functional 553ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // data). 554ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // 555ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // The templated methods below use the ProgramStateTrait<T> class 556ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // to resolve keys into the GDM and to return data values to clients. 557ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // 558ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 559ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Trait based GDM dispatch. 560ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template <typename T> 5618bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef set(ProgramStateRef st, typename ProgramStateTrait<T>::data_type D) { 562ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return addGDM(st, ProgramStateTrait<T>::GDMIndex(), 563ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ProgramStateTrait<T>::MakeVoidPtr(D)); 564ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 565ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 566ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template<typename T> 5678bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef set(ProgramStateRef st, 568ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::key_type K, 569ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::value_type V, 570ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::context_type C) { 571ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 572ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return addGDM(st, ProgramStateTrait<T>::GDMIndex(), 573ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ProgramStateTrait<T>::MakeVoidPtr(ProgramStateTrait<T>::Set(st->get<T>(), K, V, C))); 574ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 575ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 576ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template <typename T> 5778bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef add(ProgramStateRef st, 578ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::key_type K, 579ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::context_type C) { 580ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return addGDM(st, ProgramStateTrait<T>::GDMIndex(), 581ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ProgramStateTrait<T>::MakeVoidPtr(ProgramStateTrait<T>::Add(st->get<T>(), K, C))); 582ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 583ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 584ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template <typename T> 5858bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef remove(ProgramStateRef st, 586ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::key_type K, 587ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::context_type C) { 588ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 589ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return addGDM(st, ProgramStateTrait<T>::GDMIndex(), 590ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ProgramStateTrait<T>::MakeVoidPtr(ProgramStateTrait<T>::Remove(st->get<T>(), K, C))); 591ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 592ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 593ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template <typename T> 5948bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef remove(ProgramStateRef st) { 595ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return removeGDM(st, ProgramStateTrait<T>::GDMIndex()); 596ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 597ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 598ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void *FindGDMContext(void *index, 599ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void *(*CreateContext)(llvm::BumpPtrAllocator&), 600ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void (*DeleteContext)(void*)); 601ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 602ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek template <typename T> 603ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::context_type get_context() { 604ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void *p = FindGDMContext(ProgramStateTrait<T>::GDMIndex(), 605ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ProgramStateTrait<T>::CreateContext, 606ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ProgramStateTrait<T>::DeleteContext); 607ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 608ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return ProgramStateTrait<T>::MakeContext(p); 609ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 610ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 6118bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek const llvm::APSInt* getSymVal(ProgramStateRef St, SymbolRef sym) { 612ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return ConstraintMgr->getSymVal(St, sym); 613ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 614ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 6158bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek void EndPath(ProgramStateRef St) { 616ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek ConstraintMgr->EndPath(St); 617ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 618ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek}; 619ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 620ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 621ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek//===----------------------------------------------------------------------===// 622ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek// Out-of-line method definitions for ProgramState. 623ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek//===----------------------------------------------------------------------===// 624ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 625ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekinline const VarRegion* ProgramState::getRegion(const VarDecl *D, 6265eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek const LocationContext *LC) const 6275eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek{ 628ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().getRegionManager().getVarRegion(D, LC); 629ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 630ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 6318bef8238181a30e52dea380789a7e2d760eac532Ted Kremenekinline ProgramStateRef ProgramState::assume(DefinedOrUnknownSVal Cond, 632ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek bool Assumption) const { 633ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek if (Cond.isUnknown()) 634ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return this; 635ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 636ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().ConstraintMgr->assume(this, cast<DefinedSVal>(Cond), 637ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek Assumption); 638ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 639ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 6408bef8238181a30e52dea380789a7e2d760eac532Ted Kremenekinline std::pair<ProgramStateRef , ProgramStateRef > 641ae160f880d183ab938fd7ce3b891694ae2f569c0Ted KremenekProgramState::assume(DefinedOrUnknownSVal Cond) const { 642ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek if (Cond.isUnknown()) 643ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return std::make_pair(this, this); 644ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 645ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().ConstraintMgr->assumeDual(this, 646ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek cast<DefinedSVal>(Cond)); 647ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 648ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 6498bef8238181a30e52dea380789a7e2d760eac532Ted Kremenekinline ProgramStateRef ProgramState::bindLoc(SVal LV, SVal V) const { 650ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return !isa<Loc>(LV) ? this : bindLoc(cast<Loc>(LV), V); 651ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 652ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 653ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekinline Loc ProgramState::getLValue(const VarDecl *VD, 654ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const LocationContext *LC) const { 655ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().StoreMgr->getLValueVar(VD, LC); 656ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 657ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 658ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekinline Loc ProgramState::getLValue(const CompoundLiteralExpr *literal, 659ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const LocationContext *LC) const { 660ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().StoreMgr->getLValueCompoundLiteral(literal, LC); 661ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 662ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 663ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekinline SVal ProgramState::getLValue(const ObjCIvarDecl *D, SVal Base) const { 664ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().StoreMgr->getLValueIvar(D, Base); 665ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 666ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 667ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekinline SVal ProgramState::getLValue(const FieldDecl *D, SVal Base) const { 668ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().StoreMgr->getLValueField(D, Base); 669ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 670ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 6713a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Roseinline SVal ProgramState::getLValue(const IndirectFieldDecl *D, 6723a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Rose SVal Base) const { 6733a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Rose StoreManager &SM = *getStateManager().StoreMgr; 6743a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Rose for (IndirectFieldDecl::chain_iterator I = D->chain_begin(), 6753a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Rose E = D->chain_end(); 6763a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Rose I != E; ++I) { 6773a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Rose Base = SM.getLValueField(cast<FieldDecl>(*I), Base); 6783a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Rose } 6793a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Rose 6803a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Rose return Base; 6813a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Rose} 6823a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861eJordan Rose 683ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekinline SVal ProgramState::getLValue(QualType ElementType, SVal Idx, SVal Base) const{ 684ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek if (NonLoc *N = dyn_cast<NonLoc>(&Idx)) 685ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().StoreMgr->getLValueElement(ElementType, *N, Base); 686ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return UnknownVal(); 687ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 688ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 689ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekinline const llvm::APSInt *ProgramState::getSymVal(SymbolRef sym) const { 690ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().getSymVal(this, sym); 691ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 692ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 6935eca482fe895ea57bc82410222e6426c09e63284Ted Kremenekinline SVal ProgramState::getSVal(const Stmt *Ex, const LocationContext *LCtx, 6945eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek bool useOnlyDirectBindings) const{ 6955eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek return Env.getSVal(EnvironmentEntry(Ex, LCtx), 6965eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek *getStateManager().svalBuilder, 697ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek useOnlyDirectBindings); 698ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 699ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 7005eca482fe895ea57bc82410222e6426c09e63284Ted Kremenekinline SVal 7015eca482fe895ea57bc82410222e6426c09e63284Ted KremenekProgramState::getSValAsScalarOrLoc(const Stmt *S, 7025eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek const LocationContext *LCtx) const { 703ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek if (const Expr *Ex = dyn_cast<Expr>(S)) { 704ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek QualType T = Ex->getType(); 705591b5f53c0e11d87401b4804bb1be1a53f95c619Anna Zaks if (Ex->isGLValue() || Loc::isLocType(T) || T->isIntegerType()) 7065eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek return getSVal(S, LCtx); 707ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek } 708ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 709ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return UnknownVal(); 710ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 711ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 712ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekinline SVal ProgramState::getRawSVal(Loc LV, QualType T) const { 7131437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks return getStateManager().StoreMgr->getBinding(getStore(), LV, T); 714ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 715ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 716ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekinline SVal ProgramState::getSVal(const MemRegion* R) const { 7171437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks return getStateManager().StoreMgr->getBinding(getStore(), 7181437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks loc::MemRegionVal(R)); 719ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 720ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 721ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekinline BasicValueFactory &ProgramState::getBasicVals() const { 722ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().getBasicVals(); 723ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 724ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 725ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenekinline SymbolManager &ProgramState::getSymbolManager() const { 726ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().getSymbolManager(); 727ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 728ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 729ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektemplate<typename T> 7308bef8238181a30e52dea380789a7e2d760eac532Ted KremenekProgramStateRef ProgramState::add(typename ProgramStateTrait<T>::key_type K) const { 731ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().add<T>(this, K, get_context<T>()); 732ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 733ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 734ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektemplate <typename T> 735ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektypename ProgramStateTrait<T>::context_type ProgramState::get_context() const { 736ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().get_context<T>(); 737ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 738ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 739ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektemplate<typename T> 7408bef8238181a30e52dea380789a7e2d760eac532Ted KremenekProgramStateRef ProgramState::remove(typename ProgramStateTrait<T>::key_type K) const { 741ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().remove<T>(this, K, get_context<T>()); 742ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 743ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 744ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektemplate<typename T> 7458bef8238181a30e52dea380789a7e2d760eac532Ted KremenekProgramStateRef ProgramState::remove(typename ProgramStateTrait<T>::key_type K, 746ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::context_type C) const { 747ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().remove<T>(this, K, C); 748ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 749ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 750ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektemplate <typename T> 7518bef8238181a30e52dea380789a7e2d760eac532Ted KremenekProgramStateRef ProgramState::remove() const { 752ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().remove<T>(this); 753ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 754ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 755ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektemplate<typename T> 7568bef8238181a30e52dea380789a7e2d760eac532Ted KremenekProgramStateRef ProgramState::set(typename ProgramStateTrait<T>::data_type D) const { 757ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().set<T>(this, D); 758ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 759ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 760ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektemplate<typename T> 7618bef8238181a30e52dea380789a7e2d760eac532Ted KremenekProgramStateRef ProgramState::set(typename ProgramStateTrait<T>::key_type K, 762ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::value_type E) const { 763ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().set<T>(this, K, E, get_context<T>()); 764ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 765ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 766ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektemplate<typename T> 7678bef8238181a30e52dea380789a7e2d760eac532Ted KremenekProgramStateRef ProgramState::set(typename ProgramStateTrait<T>::key_type K, 768ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::value_type E, 769ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek typename ProgramStateTrait<T>::context_type C) const { 770ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return getStateManager().set<T>(this, K, E, C); 771ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 772ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 773ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektemplate <typename CB> 774ae160f880d183ab938fd7ce3b891694ae2f569c0Ted KremenekCB ProgramState::scanReachableSymbols(SVal val) const { 775ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek CB cb(this); 776ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek scanReachableSymbols(val, cb); 777ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return cb; 778ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 779ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 780ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektemplate <typename CB> 781ae160f880d183ab938fd7ce3b891694ae2f569c0Ted KremenekCB ProgramState::scanReachableSymbols(const SVal *beg, const SVal *end) const { 782ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek CB cb(this); 783ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek scanReachableSymbols(beg, end, cb); 784ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return cb; 785ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 786ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 787ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenektemplate <typename CB> 788ae160f880d183ab938fd7ce3b891694ae2f569c0Ted KremenekCB ProgramState::scanReachableSymbols(const MemRegion * const *beg, 789ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek const MemRegion * const *end) const { 790ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek CB cb(this); 791ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek scanReachableSymbols(beg, end, cb); 792ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek return cb; 793ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} 794ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 7955f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks/// \class ScanReachableSymbols 7965f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks/// A Utility class that allows to visit the reachable symbols using a custom 7975f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks/// SymbolVisitor. 798e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseclass ScanReachableSymbols { 7995f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks typedef llvm::DenseMap<const void*, unsigned> VisitedItems; 8005f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks 8015f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks VisitedItems visited; 8028bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ProgramStateRef state; 8035f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks SymbolVisitor &visitor; 8045f625712f622f6e57de17b6f7eec242956b993eeAnna Zakspublic: 8055f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks 8068bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek ScanReachableSymbols(ProgramStateRef st, SymbolVisitor& v) 8075f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks : state(st), visitor(v) {} 8085f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks 8095f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks bool scan(nonloc::CompoundVal val); 8105f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks bool scan(SVal val); 8115f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks bool scan(const MemRegion *R); 8125f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks bool scan(const SymExpr *sym); 8135f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks}; 8145f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks 815ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} // end GR namespace 816ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 817ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek} // end clang namespace 818ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 819ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#endif 820