14323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek//== Store.h - Interface for maps from Locations to Values ------*- C++ -*--==// 24323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek// 34323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek// The LLVM Compiler Infrastructure 44323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek// 54323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek// This file is distributed under the University of Illinois Open Source 64323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek// License. See LICENSE.TXT for details. 74323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek// 84323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek//===----------------------------------------------------------------------===// 94323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek// 104323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek// This file defined the types Store and StoreManager. 114323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek// 124323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek//===----------------------------------------------------------------------===// 134323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek 145a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#ifndef LLVM_CLANG_GR_STORE_H 155a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#define LLVM_CLANG_GR_STORE_H 164323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek 179b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h" 189b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h" 1930a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/StaticAnalyzer/Core/PathSensitive/StoreRef.h" 2067f28534c090650ffa123afa84ff4a96f56de14eTed Kremenek#include "llvm/ADT/DenseSet.h" 21ab28099e3bd4859585ccb316f9f571c8c6b035fdZhongxing Xu#include "llvm/ADT/Optional.h" 224323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek 234323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremeneknamespace clang { 241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 255a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass Stmt; 265a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass Expr; 275a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass ObjCIvarDecl; 28aa66b08d2d8bbf05bae8c68f58724f754ab57b35Jordan Roseclass CXXBasePath; 295a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass StackFrameContext; 305a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 319ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento { 325a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 33740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CallEvent; 3418c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenekclass ProgramState; 3518c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenekclass ProgramStateManager; 36e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Roseclass ScanReachableSymbols; 371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zakstypedef llvm::DenseSet<SymbolRef> InvalidatedSymbols; 39bf53dfac8195835028bd6347433f7dbebcc29fc1Anna Zaks 404323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenekclass StoreManager { 41d6cfbe4bd5103cd020d987d09438744eb17226a3Ted Kremenekprotected: 42c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek SValBuilder &svalBuilder; 4318c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek ProgramStateManager &StateMgr; 448d7f5481a0eeb4c0508202a4bd2b754cfa93c4feTed Kremenek 45d6cfbe4bd5103cd020d987d09438744eb17226a3Ted Kremenek /// MRMgr - Manages region objects associated with this StoreManager. 468d7f5481a0eeb4c0508202a4bd2b754cfa93c4feTed Kremenek MemRegionManager &MRMgr; 472a393db0969630d01a71fd384affb33ea0a693d1Zhongxing Xu ASTContext &Ctx; 48d6cfbe4bd5103cd020d987d09438744eb17226a3Ted Kremenek 4918c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek StoreManager(ProgramStateManager &stateMgr); 50d6cfbe4bd5103cd020d987d09438744eb17226a3Ted Kremenek 511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 524323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek virtual ~StoreManager() {} 531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54c6ed3840d685bd40bd921dd1f76cfb5a9b4fc599Ted Kremenek /// Return the value bound to specified location in a given state. 5516ae9de07730832945204877d752db7f1c070962James Dennett /// \param[in] store The analysis state. 56c6ed3840d685bd40bd921dd1f76cfb5a9b4fc599Ted Kremenek /// \param[in] loc The symbolic memory location. 571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \param[in] T An optional type that provides a hint indicating the 58c6ed3840d685bd40bd921dd1f76cfb5a9b4fc599Ted Kremenek /// expected type of the returned value. This is used if the value is 59c6ed3840d685bd40bd921dd1f76cfb5a9b4fc599Ted Kremenek /// lazily computed. 60c6ed3840d685bd40bd921dd1f76cfb5a9b4fc599Ted Kremenek /// \return The value bound to the location \c loc. 611437425a62dbf7bdb0a855d3ed3b05ed2019ec1eAnna Zaks virtual SVal getBinding(Store store, Loc loc, QualType T = QualType()) = 0; 624193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu 63c6ed3840d685bd40bd921dd1f76cfb5a9b4fc599Ted Kremenek /// Return a state with the specified value bound to the given location. 6416ae9de07730832945204877d752db7f1c070962James Dennett /// \param[in] store The analysis state. 65c6ed3840d685bd40bd921dd1f76cfb5a9b4fc599Ted Kremenek /// \param[in] loc The symbolic memory location. 66c6ed3840d685bd40bd921dd1f76cfb5a9b4fc599Ted Kremenek /// \param[in] val The value to bind to location \c loc. 6716ae9de07730832945204877d752db7f1c070962James Dennett /// \return A pointer to a ProgramState object that contains the same 6816ae9de07730832945204877d752db7f1c070962James Dennett /// bindings as \c state with the addition of having the value specified 6916ae9de07730832945204877d752db7f1c070962James Dennett /// by \c val bound to the location given for \c loc. 7077a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek virtual StoreRef Bind(Store store, Loc loc, SVal val) = 0; 71a5ce966d1a23d84aa5e849cf0ed62494e736ea6aZhongxing Xu 7277a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek virtual StoreRef BindDefault(Store store, const MemRegion *R, SVal V); 7356a46b51df691f857f7120aaf2d4deeff0b014deTed Kremenek 7456a46b51df691f857f7120aaf2d4deeff0b014deTed Kremenek /// \brief Create a new store with the specified binding removed. 75ad0fe03b897f9486191e75c8d90c3ffa9b4fd6a5Ted Kremenek /// \param ST the original store, that is the basis for the new store. 76ad0fe03b897f9486191e75c8d90c3ffa9b4fd6a5Ted Kremenek /// \param L the location whose binding should be removed. 77ad0fe03b897f9486191e75c8d90c3ffa9b4fd6a5Ted Kremenek virtual StoreRef killBinding(Store ST, Loc L) = 0; 781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7959e8f1128019aef95f45c6fa09cc0f8bfea99f13Ted Kremenek /// getInitialStore - Returns the initial "empty" store representing the 8059e8f1128019aef95f45c6fa09cc0f8bfea99f13Ted Kremenek /// value bindings upon entry to an analyzed function. 8177a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek virtual StoreRef getInitialStore(const LocationContext *InitLoc) = 0; 821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8359e8f1128019aef95f45c6fa09cc0f8bfea99f13Ted Kremenek /// getRegionManager - Returns the internal RegionManager object that is 8459e8f1128019aef95f45c6fa09cc0f8bfea99f13Ted Kremenek /// used to query and manipulate MemRegion objects. 85d6cfbe4bd5103cd020d987d09438744eb17226a3Ted Kremenek MemRegionManager& getRegionManager() { return MRMgr; } 861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 87bd409d040bffef3e7ba862941dd706b1f7021141Zhongxing Xu virtual Loc getLValueVar(const VarDecl *VD, const LocationContext *LC) { 88c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return svalBuilder.makeLoc(MRMgr.getVarRegion(VD, LC)); 89459731d468235fa8adb27132be46a3b5654351c3Zhongxing Xu } 90459731d468235fa8adb27132be46a3b5654351c3Zhongxing Xu 919c378f705405d37f49795d5e915989de774fe11fTed Kremenek Loc getLValueCompoundLiteral(const CompoundLiteralExpr *CL, 92bd409d040bffef3e7ba862941dd706b1f7021141Zhongxing Xu const LocationContext *LC) { 93459731d468235fa8adb27132be46a3b5654351c3Zhongxing Xu return loc::MemRegionVal(MRMgr.getCompoundLiteralRegion(CL, LC)); 94459731d468235fa8adb27132be46a3b5654351c3Zhongxing Xu } 951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 96c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer virtual SVal getLValueIvar(const ObjCIvarDecl *decl, SVal base); 971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 989c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual SVal getLValueField(const FieldDecl *D, SVal Base) { 99c1511e04998e685c9e030323e248363b9633267dZhongxing Xu return getLValueFieldOrIvar(D, Base); 100c1511e04998e685c9e030323e248363b9633267dZhongxing Xu } 1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10202282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek virtual SVal getLValueElement(QualType elementType, NonLoc offset, SVal Base); 10360156f0596a7ab9a39ddec74942b60a3da847174Zhongxing Xu 10432f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose // FIXME: This should soon be eliminated altogether; clients should deal with 10532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose // region extents directly. 1068bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek virtual DefinedOrUnknownSVal getSizeInElements(ProgramStateRef state, 1073ed04d37573c566205d965d2e91d54ccae898d0aZhongxing Xu const MemRegion *region, 1083ed04d37573c566205d965d2e91d54ccae898d0aZhongxing Xu QualType EleTy) { 10960156f0596a7ab9a39ddec74942b60a3da847174Zhongxing Xu return UnknownVal(); 11060156f0596a7ab9a39ddec74942b60a3da847174Zhongxing Xu } 11160156f0596a7ab9a39ddec74942b60a3da847174Zhongxing Xu 112d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis /// ArrayToPointer - Used by ExprEngine::VistCast to handle implicit 1139deb0e35dea0f82691fadb60b61f45887ba67abaTed Kremenek /// conversions between arrays and pointers. 1147f1fd2f182717d5ce6cde60398128910c90f98beAnna Zaks virtual SVal ArrayToPointer(Loc Array, QualType ElementTy) = 0; 1151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 116aa66b08d2d8bbf05bae8c68f58724f754ab57b35Jordan Rose /// Evaluates a chain of derived-to-base casts through the path specified in 117aa66b08d2d8bbf05bae8c68f58724f754ab57b35Jordan Rose /// \p Cast. 118aa66b08d2d8bbf05bae8c68f58724f754ab57b35Jordan Rose SVal evalDerivedToBase(SVal Derived, const CastExpr *Cast); 119aa66b08d2d8bbf05bae8c68f58724f754ab57b35Jordan Rose 120aa66b08d2d8bbf05bae8c68f58724f754ab57b35Jordan Rose /// Evaluates a chain of derived-to-base casts through the specified path. 121aa66b08d2d8bbf05bae8c68f58724f754ab57b35Jordan Rose SVal evalDerivedToBase(SVal Derived, const CXXBasePath &CastPath); 1222c5f8d79ed128892fa548a3308a938a3a53fbb5eJordan Rose 1232c5f8d79ed128892fa548a3308a938a3a53fbb5eJordan Rose /// Evaluates a derived-to-base cast through a single level of derivation. 1244411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose SVal evalDerivedToBase(SVal Derived, QualType DerivedPtrType, 1254411b423e91da0a2c879b70c0222aeba35f72044Jordan Rose bool IsVirtual); 126e19f86edab8fb3c2c1e99e0e9815b6058504df9bAnna Zaks 127e19f86edab8fb3c2c1e99e0e9815b6058504df9bAnna Zaks /// \brief Evaluates C++ dynamic_cast cast. 128e19f86edab8fb3c2c1e99e0e9815b6058504df9bAnna Zaks /// The callback may result in the following 3 scenarios: 129e19f86edab8fb3c2c1e99e0e9815b6058504df9bAnna Zaks /// - Successful cast (ex: derived is subclass of base). 130e19f86edab8fb3c2c1e99e0e9815b6058504df9bAnna Zaks /// - Failed cast (ex: derived is definitely not a subclass of base). 131e19f86edab8fb3c2c1e99e0e9815b6058504df9bAnna Zaks /// - We don't know (base is a symbolic region and we don't have 132e19f86edab8fb3c2c1e99e0e9815b6058504df9bAnna Zaks /// enough info to determine if the cast will succeed at run time). 133e19f86edab8fb3c2c1e99e0e9815b6058504df9bAnna Zaks /// The function returns an SVal representing the derived class; it's 134e19f86edab8fb3c2c1e99e0e9815b6058504df9bAnna Zaks /// valid only if Failed flag is set to false. 135aa66b08d2d8bbf05bae8c68f58724f754ab57b35Jordan Rose SVal evalDynamicCast(SVal Base, QualType DerivedPtrType, bool &Failed); 1364fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu 137856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu const ElementRegion *GetElementZeroRegion(const MemRegion *R, QualType T); 138856c6bcaea56e05255e9f3997ddd56b5c18a14f0Zhongxing Xu 1392534528c22260211a073e192c38d0db84c70c327Ted Kremenek /// castRegion - Used by ExprEngine::VisitCast to handle casts from 1406eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek /// a MemRegion* to a specific location type. 'R' is the region being 1416eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek /// casted and 'CastToTy' the result type of the cast. 1422534528c22260211a073e192c38d0db84c70c327Ted Kremenek const MemRegion *castRegion(const MemRegion *region, QualType CastToTy); 1438203725f37fbb45ded343e4378247fee3389c0daZhongxing Xu 14477a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek virtual StoreRef removeDeadBindings(Store store, const StackFrameContext *LCtx, 145bea2753da897ede723e70bcd17023d050b0603d0Ted Kremenek SymbolReaper& SymReaper) = 0; 146bbe8ff48be1728ef145c874d6d99879fac78892fZhongxing Xu 147fa7a95c62aa573a30d87c215b320b0086ed08bdcTed Kremenek virtual bool includedInBindings(Store store, 148fa7a95c62aa573a30d87c215b320b0086ed08bdcTed Kremenek const MemRegion *region) const = 0; 149fa7a95c62aa573a30d87c215b320b0086ed08bdcTed Kremenek 15077a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek /// If the StoreManager supports it, increment the reference count of 15177a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek /// the specified Store object. 15277a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek virtual void incrementReferenceCount(Store store) {} 15377a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek 15477a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek /// If the StoreManager supports it, decrement the reference count of 15577a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek /// the specified Store object. If the reference count hits 0, the memory 15677a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek /// associated with the object is recycled. 15777a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek virtual void decrementReferenceCount(Store store) {} 158bbe8ff48be1728ef145c874d6d99879fac78892fZhongxing Xu 159686775deca8b8685eb90801495880e3abdd844c2Chris Lattner typedef SmallVector<const MemRegion *, 8> InvalidatedRegions; 160c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose 1612534528c22260211a073e192c38d0db84c70c327Ted Kremenek /// invalidateRegions - Clears out the specified regions from the store, 162c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose /// marking their values as unknown. Depending on the store, this may also 163c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose /// invalidate additional regions that may have changed based on accessing 164c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose /// the given regions. Optionally, invalidates non-static globals as well. 165c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose /// \param[in] store The initial store 166658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks /// \param[in] Values The values to invalidate. 167c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose /// \param[in] E The current statement being evaluated. Used to conjure 168c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose /// symbols to mark the values of invalidated regions. 169c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose /// \param[in] Count The current block count. Used to conjure 170c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose /// symbols to mark the values of invalidated regions. 171eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks /// \param[in] Call The call expression which will be used to determine which 172eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks /// globals should get invalidated. 173658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks /// \param[in,out] IS A set to fill with any symbols that are no longer 174658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks /// accessible. Pass \c NULL if this information will not be used. 175da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev /// \param[in] ITraits Information about invalidation for a particular 176da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev /// region/symbol. 177658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks /// \param[in,out] InvalidatedTopLevel A vector to fill with regions 178da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev //// explicitly being invalidated. Pass \c NULL if this 179658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks /// information will not be used. 18016ae9de07730832945204877d752db7f1c070962James Dennett /// \param[in,out] Invalidated A vector to fill with any regions being 181c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose /// invalidated. This should include any regions explicitly invalidated 182c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose /// even if they do not currently have bindings. Pass \c NULL if this 183c2b7dfaad674587cfd220ff447b3710d252130c3Jordy Rose /// information will not be used. 18477a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek virtual StoreRef invalidateRegions(Store store, 185658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks ArrayRef<SVal> Values, 186658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks const Expr *E, unsigned Count, 187658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks const LocationContext *LCtx, 188658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks const CallEvent *Call, 189658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks InvalidatedSymbols &IS, 190da8d37ce42d2db4e1e76ee6f7f38f10f6b0ef0f8Anton Yartsev RegionAndSymbolInvalidationTraits &ITraits, 191658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks InvalidatedRegions *InvalidatedTopLevel, 192658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks InvalidatedRegions *Invalidated) = 0; 1931004a9f2b9eaf885e55ad8656194ef2a341db0f5Ted Kremenek 1942ccf047adf877f5e821210b1ce1a2c8289acadc0Ted Kremenek /// enterStackFrame - Let the StoreManager to do something when execution 1954e3c1f7c2a2053cf770f744846a87087415eb340Zhongxing Xu /// engine is about to execute into a callee. 196e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose StoreRef enterStackFrame(Store store, 197e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose const CallEvent &Call, 198e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose const StackFrameContext *CalleeCtx); 1994e3c1f7c2a2053cf770f744846a87087415eb340Zhongxing Xu 200e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose /// Finds the transitive closure of symbols within the given region. 201e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose /// 202e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose /// Returns false if the visitor aborted the scan. 203e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose virtual bool scanReachableSymbols(Store S, const MemRegion *R, 204e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose ScanReachableSymbols &Visitor) = 0; 205e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 2069c378f705405d37f49795d5e915989de774fe11fTed Kremenek virtual void print(Store store, raw_ostream &Out, 207a622d8c2719e927b47f48dbebcece770e752dfb8Ted Kremenek const char* nl, const char *sep) = 0; 2081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20960dbad831a35ba0f58256b9bcd2a085af98ff2ecTed Kremenek class BindingsHandler { 2101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump public: 21160dbad831a35ba0f58256b9bcd2a085af98ff2ecTed Kremenek virtual ~BindingsHandler(); 21260dbad831a35ba0f58256b9bcd2a085af98ff2ecTed Kremenek virtual bool HandleBinding(StoreManager& SMgr, Store store, 21367f28534c090650ffa123afa84ff4a96f56de14eTed Kremenek const MemRegion *region, SVal val) = 0; 21460dbad831a35ba0f58256b9bcd2a085af98ff2ecTed Kremenek }; 2151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21627b867ea1c9cb4b40f9b817c303d6df3ee753da9Anna Zaks class FindUniqueBinding : 21727b867ea1c9cb4b40f9b817c303d6df3ee753da9Anna Zaks public BindingsHandler { 21827b867ea1c9cb4b40f9b817c303d6df3ee753da9Anna Zaks SymbolRef Sym; 21927b867ea1c9cb4b40f9b817c303d6df3ee753da9Anna Zaks const MemRegion* Binding; 22027b867ea1c9cb4b40f9b817c303d6df3ee753da9Anna Zaks bool First; 22127b867ea1c9cb4b40f9b817c303d6df3ee753da9Anna Zaks 22227b867ea1c9cb4b40f9b817c303d6df3ee753da9Anna Zaks public: 2236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FindUniqueBinding(SymbolRef sym) 2246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Sym(sym), Binding(nullptr), First(true) {} 22527b867ea1c9cb4b40f9b817c303d6df3ee753da9Anna Zaks 22627b867ea1c9cb4b40f9b817c303d6df3ee753da9Anna Zaks bool HandleBinding(StoreManager& SMgr, Store store, const MemRegion* R, 227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SVal val) override; 2287247c88d1e41514a41085f83ebf03dd5220e054aDavid Blaikie LLVM_EXPLICIT operator bool() { return First && Binding; } 22927b867ea1c9cb4b40f9b817c303d6df3ee753da9Anna Zaks const MemRegion *getRegion() { return Binding; } 23027b867ea1c9cb4b40f9b817c303d6df3ee753da9Anna Zaks }; 23127b867ea1c9cb4b40f9b817c303d6df3ee753da9Anna Zaks 23260dbad831a35ba0f58256b9bcd2a085af98ff2ecTed Kremenek /// iterBindings - Iterate over the bindings in the Store. 2330307cd59e0a48adeb9b69e3270dfe3625e7e2954Ted Kremenek virtual void iterBindings(Store store, BindingsHandler& f) = 0; 2340307cd59e0a48adeb9b69e3270dfe3625e7e2954Ted Kremenek 2351894dce96476dbe58c0e60d47f8987cbeb3d3869Ted Kremenekprotected: 236c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek const MemRegion *MakeElementRegion(const MemRegion *baseRegion, 23709270cc1b9cdd4c50012cb7984df8745e05833e5Zhongxing Xu QualType pointeeTy, uint64_t index = 0); 2381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2391894dce96476dbe58c0e60d47f8987cbeb3d3869Ted Kremenek /// CastRetrievedVal - Used by subclasses of StoreManager to implement 2401894dce96476dbe58c0e60d47f8987cbeb3d3869Ted Kremenek /// implicit casts that arise from loads from regions that are reinterpreted 2411894dce96476dbe58c0e60d47f8987cbeb3d3869Ted Kremenek /// as another region. 2429697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek SVal CastRetrievedVal(SVal val, const TypedValueRegion *region, 2439697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek QualType castTy, bool performTestOnly = true); 244c1511e04998e685c9e030323e248363b9633267dZhongxing Xu 245c1511e04998e685c9e030323e248363b9633267dZhongxing Xuprivate: 2469c378f705405d37f49795d5e915989de774fe11fTed Kremenek SVal getLValueFieldOrIvar(const Decl *decl, SVal base); 2474323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek}; 24859e8f1128019aef95f45c6fa09cc0f8bfea99f13Ted Kremenek 24977a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek 25077a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenekinline StoreRef::StoreRef(Store store, StoreManager & smgr) 25177a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek : store(store), mgr(smgr) { 25277a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek if (store) 25377a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek mgr.incrementReferenceCount(store); 25477a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek} 25577a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek 25677a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenekinline StoreRef::StoreRef(const StoreRef &sr) 25777a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek : store(sr.store), mgr(sr.mgr) 25877a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek{ 25977a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek if (store) 26077a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek mgr.incrementReferenceCount(store); 26177a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek} 26277a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek 26377a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenekinline StoreRef::~StoreRef() { 26477a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek if (store) 26577a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek mgr.decrementReferenceCount(store); 26677a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek} 26777a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek 26877a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenekinline StoreRef &StoreRef::operator=(StoreRef const &newStore) { 26977a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek assert(&newStore.mgr == &mgr); 27077a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek if (store != newStore.store) { 27177a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek mgr.incrementReferenceCount(newStore.store); 27277a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek mgr.decrementReferenceCount(store); 27377a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek store = newStore.getStore(); 27477a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek } 27577a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek return *this; 27677a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek} 27777a4d5687c2cb3199c689892c9d040a94ff270afTed Kremenek 27818c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek// FIXME: Do we need to pass ProgramStateManager anymore? 27918c66fdc3c4008d335885695fe36fb5353c5f672Ted KremenekStoreManager *CreateRegionStoreManager(ProgramStateManager& StMgr); 28018c66fdc3c4008d335885695fe36fb5353c5f672Ted KremenekStoreManager *CreateFieldsOnlyRegionStoreManager(ProgramStateManager& StMgr); 2815a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 2825a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace 2835a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 2844323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek} // end clang namespace 2854323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek 2864323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek#endif 287