- Revert r59229 and r59232: AllocRegion should be immutable.

- Temporarily disabled test Analysis/array-struct.c for region store.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59245 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Ted Kremenek 2008-11-13 15:42:31 +00:00
Родитель e4d139374c
Коммит 82bd99f4db
3 изменённых файлов: 31 добавлений и 59 удалений

Просмотреть файл

@ -37,9 +37,9 @@ class MemRegionManager;
class MemRegion : public llvm::FoldingSetNode {
public:
enum Kind { MemSpaceRegionKind, SymbolicRegionKind,
AllocaRegionKind,
// Typed regions.
BEG_TYPED_REGIONS,
AllocaRegionKind,
CompoundLiteralRegionKind,
StringRegionKind, ElementRegionKind,
// Decl Regions.
@ -102,6 +102,34 @@ public:
}
};
/// 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
@ -142,42 +170,6 @@ public:
}
};
/// 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;

Просмотреть файл

@ -1681,26 +1681,6 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
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())));
}

Просмотреть файл

@ -1,5 +1,5 @@
// RUN: clang -checker-simple -verify %s &&
// RUN: clang -checker-simple -analyzer-store-region -verify %s
// RUN: clang -checker-simple -verify %s
// DISABLED: clang -checker-simple -analyzer-store-region -verify %s
struct s {
int data;