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