class MemRegion : public llvm::FoldingSetNode {
public:
enum Kind { MemSpaceRegionKind, SymbolicRegionKind,
+ AllocaRegionKind,
// Typed regions.
BEG_TYPED_REGIONS,
- AllocaRegionKind,
CompoundLiteralRegionKind,
StringRegionKind, ElementRegionKind,
// Decl Regions.
}
};
+/// AllocaRegion - A region that represents an untyped blob of bytes created
+/// by a call to 'alloca'.
+class AllocaRegion : public SubRegion {
+ friend class MemRegionManager;
+protected:
+ unsigned Cnt; // Block counter. Used to distinguish different pieces of
+ // memory allocated by alloca at the same call site.
+ const Expr* Ex;
+
+ AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion* superRegion)
+ : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
+
+public:
+
+ const Expr* getExpr() const { return Ex; }
+
+ void Profile(llvm::FoldingSetNodeID& ID) const;
+
+ static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,
+ unsigned Cnt);
+
+ void print(llvm::raw_ostream& os) const;
+
+ static bool classof(const MemRegion* R) {
+ return R->getKind() == AllocaRegionKind;
+ }
+};
+
/// SymbolicRegion - A special, "non-concrete" region. Unlike other region
/// clases, SymbolicRegion represents a region that serves as an alias for
/// either a real region, a NULL pointer, etc. It essentially is used to
}
};
-/// AllocaRegion - A region that represents an untyped blob of bytes created
-/// by a call to 'alloca'.
-class AllocaRegion : public TypedRegion {
- friend class MemRegionManager;
-protected:
- unsigned Cnt; // Block counter. Used to distinguish different pieces of
- // memory allocated by alloca at the same call site.
- const Expr* Ex;
-
- QualType T;
-
- AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion* superRegion)
- : TypedRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
-
-public:
-
- const Expr* getExpr() const { return Ex; }
-
- void setType(QualType t) { T = t; }
-
- QualType getType(ASTContext& C) const {
- return C.getCanonicalType(T);
- }
-
- void Profile(llvm::FoldingSetNodeID& ID) const;
-
- static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,
- unsigned Cnt);
-
- void print(llvm::raw_ostream& os) const;
-
- static bool classof(const MemRegion* R) {
- return R->getKind() == AllocaRegionKind;
- }
-};
-
/// StringRegion - Region associated with a StringLiteral.
class StringRegion : public TypedRegion {
friend class MemRegionManager;
continue;
}
- // Cast alloca'ed pointer to typed pointer.
- if (isa<loc::MemRegionVal>(V)) {
- if (const AllocaRegion* AR =
- dyn_cast<AllocaRegion>(cast<loc::MemRegionVal>(V).getRegion())) {
-
- // Set the AllocaRegion's type.
- const_cast<AllocaRegion*>(AR)->setType(T);
-
- // Set the CastExpr's value to a pointer to the first element.
- MemRegionManager& RM = getStateManager().getRegionManager();
-
- llvm::APSInt Zero(llvm::APInt::getNullValue(32), false);
- SVal ZeroIdx(nonloc::ConcreteInt(getBasicVals().getValue(Zero)));
- const ElementRegion* ER = RM.getElementRegion(ZeroIdx, AR);
-
- MakeNode(Dst, CastE, N, BindExpr(St, CastE, loc::MemRegionVal(ER)));
- continue;
- }
- }
-
// All other cases.
MakeNode(Dst, CastE, N, BindExpr(St, CastE, EvalCast(V, CastE->getType())));
}