return getValue(b ? 1 : 0, Ctx.getTypeSize(Ctx.IntTy), false);
}
- const SymIntConstraint& getConstraint(SymbolID sym, BinaryOperator::Opcode Op,
+ const SymIntConstraint& getConstraint(SymbolRef sym, BinaryOperator::Opcode Op,
const llvm::APSInt& V);
const CompoundValData* getCompoundValData(QualType T,
class GRBugReporter : public BugReporter {
GRExprEngine& Eng;
- llvm::SmallSet<SymbolID, 10> NotableSymbols;
+ llvm::SmallSet<SymbolRef, 10> NotableSymbols;
public:
GRBugReporter(BugReporterData& d, GRExprEngine& eng)
virtual void GeneratePathDiagnostic(PathDiagnostic& PD, BugReport& R);
- void addNotableSymbol(SymbolID Sym) {
+ void addNotableSymbol(SymbolRef Sym) {
NotableSymbols.insert(Sym);
}
- bool isNotable(SymbolID Sym) const {
+ bool isNotable(SymbolRef Sym) const {
return (bool) NotableSymbols.count(Sym);
}
class GRState;
class GRStateManager;
class SVal;
-class SymbolID;
+class SymbolRef;
class ConstraintManager {
public:
SVal UpperBound, bool Assumption,
bool& isFeasible) = 0;
- virtual const GRState* AddNE(const GRState* St, SymbolID sym,
+ virtual const GRState* AddNE(const GRState* St, SymbolRef sym,
const llvm::APSInt& V) = 0;
- virtual const llvm::APSInt* getSymVal(const GRState* St, SymbolID sym) = 0;
+ virtual const llvm::APSInt* getSymVal(const GRState* St, SymbolRef sym) = 0;
- virtual bool isEqual(const GRState* St, SymbolID sym,
+ virtual bool isEqual(const GRState* St, SymbolRef sym,
const llvm::APSInt& V) const = 0;
virtual const GRState* RemoveDeadBindings(const GRState* St,
//
//===----------------------------------------------------------------------===//
//
-// This file defines SymbolID, ExprBindKey, and GRState*
+// This file defines SymbolRef, ExprBindKey, and GRState*
//
//===----------------------------------------------------------------------===//
isFeasible);
}
- const GRState* AddNE(const GRState* St, SymbolID sym, const llvm::APSInt& V) {
+ const GRState* AddNE(const GRState* St, SymbolRef sym, const llvm::APSInt& V) {
return ConstraintMgr->AddNE(St, sym, V);
}
- const llvm::APSInt* getSymVal(const GRState* St, SymbolID sym) {
+ const llvm::APSInt* getSymVal(const GRState* St, SymbolRef sym) {
return ConstraintMgr->getSymVal(St, sym);
}
return GRStateRef(Mgr->Unbind(St, LV), *Mgr);
}
- GRStateRef AddNE(SymbolID sym, const llvm::APSInt& V) {
+ GRStateRef AddNE(SymbolRef sym, const llvm::APSInt& V) {
return GRStateRef(Mgr->AddNE(St, sym, V), *Mgr);
}
/// regions do not need to be typed.
class SymbolicRegion : public MemRegion {
protected:
- const SymbolID sym;
+ const SymbolRef sym;
public:
- SymbolicRegion(const SymbolID s) : MemRegion(SymbolicRegionKind), sym(s) {}
+ SymbolicRegion(const SymbolRef s) : MemRegion(SymbolicRegionKind), sym(s) {}
- SymbolID getSymbol() const {
+ SymbolRef getSymbol() const {
return sym;
}
void Profile(llvm::FoldingSetNodeID& ID) const;
- static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolID sym);
+ static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym);
void print(llvm::raw_ostream& os) const;
/// the sizes of dynamically allocated chunks of memory with variable size.
class SymbolicExtent : public RegionExtent {
public:
- SymbolicExtent(SymbolID S) : RegionExtent(S.getNumber() << 1, Sym) {}
+ SymbolicExtent(SymbolRef S) : RegionExtent(S.getNumber() << 1, Sym) {}
- SymbolID getSymbol() const { return SymbolID(getData() >> 1); }
+ SymbolRef getSymbol() const { return SymbolRef(getData() >> 1); }
// Implement isa<T> support.
static inline bool classof(const RegionExtent* E) {
getCompoundLiteralRegion(const CompoundLiteralExpr* CL);
/// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
- SymbolicRegion* getSymbolicRegion(const SymbolID sym);
+ SymbolicRegion* getSymbolicRegion(const SymbolRef sym);
StringRegion* getStringRegion(const StringLiteral* Str);
class symbol_iterator {
const enum { One, Many } HowMany;
- union { uintptr_t sym; const SymbolID* sptr; };
+ union { uintptr_t sym; const SymbolRef* sptr; };
public:
bool operator==(const symbol_iterator& X) {
return *this;
}
- SymbolID operator*() const {
+ SymbolRef operator*() const {
if (HowMany)
return *sptr;
- return SymbolID(sym);
+ return SymbolRef(sym);
}
- symbol_iterator(SymbolID x) : HowMany(One), sym(x.getNumber()) {}
+ symbol_iterator(SymbolRef x) : HowMany(One), sym(x.getNumber()) {}
symbol_iterator() : HowMany(One), sym(~0x0) {}
- symbol_iterator(const SymbolID* x) : HowMany(Many), sptr(x) {}
+ symbol_iterator(const SymbolRef* x) : HowMany(Many), sptr(x) {}
};
symbol_iterator symbol_begin() const;
SymbolVal(unsigned SymID)
: NonLoc(SymbolValKind, reinterpret_cast<void*>((uintptr_t) SymID)) {}
- SymbolID getSymbol() const {
- return (SymbolID) reinterpret_cast<uintptr_t>(Data);
+ SymbolRef getSymbol() const {
+ return (SymbolRef) reinterpret_cast<uintptr_t>(Data);
}
static inline bool classof(const SVal* V) {
SymbolVal(unsigned SymID)
: Loc(SymbolValKind, reinterpret_cast<void*>((uintptr_t) SymID)) {}
- SymbolID getSymbol() const {
- return (SymbolID) reinterpret_cast<uintptr_t>(Data);
+ SymbolRef getSymbol() const {
+ return (SymbolRef) reinterpret_cast<uintptr_t>(Data);
}
static inline bool classof(const SVal* V) {
class StoreManager {
public:
- typedef llvm::SmallSet<SymbolID, 20> LiveSymbolsTy;
- typedef llvm::DenseSet<SymbolID> DeadSymbolsTy;
+ typedef llvm::SmallSet<SymbolRef, 20> LiveSymbolsTy;
+ typedef llvm::DenseSet<SymbolRef> DeadSymbolsTy;
virtual ~StoreManager() {}
class MemRegion;
class SymbolManager;
-class SymbolID {
+class SymbolRef {
unsigned Data;
public:
- SymbolID() : Data(~0U - 2) {}
- SymbolID(unsigned x) : Data(x) {}
+ SymbolRef() : Data(~0U - 2) {}
+ SymbolRef(unsigned x) : Data(x) {}
bool isInitialized() const { return Data != (unsigned) (~0U - 2); }
operator unsigned() const { return getNumber(); }
} // end clang namespace
namespace llvm {
- template <> struct DenseMapInfo<clang::SymbolID> {
- static inline clang::SymbolID getEmptyKey() {
- return clang::SymbolID(~0U);
+ template <> struct DenseMapInfo<clang::SymbolRef> {
+ static inline clang::SymbolRef getEmptyKey() {
+ return clang::SymbolRef(~0U);
}
- static inline clang::SymbolID getTombstoneKey() {
- return clang::SymbolID(~0U - 1);
+ static inline clang::SymbolRef getTombstoneKey() {
+ return clang::SymbolRef(~0U - 1);
}
- static unsigned getHashValue(clang::SymbolID X) {
+ static unsigned getHashValue(clang::SymbolRef X) {
return X.getNumber();
}
- static bool isEqual(clang::SymbolID X, clang::SymbolID Y) {
+ static bool isEqual(clang::SymbolRef X, clang::SymbolRef Y) {
return X.getNumber() == Y.getNumber();
}
static bool isPod() { return true; }
private:
Kind K;
- SymbolID Sym;
+ SymbolRef Sym;
protected:
- SymbolData(Kind k, SymbolID sym) : K(k), Sym(sym) {}
+ SymbolData(Kind k, SymbolRef sym) : K(k), Sym(sym) {}
public:
virtual ~SymbolData() {}
Kind getKind() const { return K; }
- SymbolID getSymbol() const { return Sym; }
+ SymbolRef getSymbol() const { return Sym; }
QualType getType(const SymbolManager& SymMgr) const;
ParmVarDecl *VD;
public:
- SymbolDataParmVar(SymbolID MySym, ParmVarDecl* vd)
+ SymbolDataParmVar(SymbolRef MySym, ParmVarDecl* vd)
: SymbolData(ParmKind, MySym), VD(vd) {}
ParmVarDecl* getDecl() const { return VD; }
VarDecl *VD;
public:
- SymbolDataGlobalVar(SymbolID MySym, VarDecl* vd) :
+ SymbolDataGlobalVar(SymbolRef MySym, VarDecl* vd) :
SymbolData(GlobalKind, MySym), VD(vd) {}
VarDecl* getDecl() const { return VD; }
const llvm::APSInt* Idx;
public:
- SymbolDataElement(SymbolID MySym, const MemRegion* r, const llvm::APSInt* idx)
+ SymbolDataElement(SymbolRef MySym, const MemRegion* r, const llvm::APSInt* idx)
: SymbolData(ElementKind, MySym), R(r), Idx(idx) {}
static void Profile(llvm::FoldingSetNodeID& profile, const MemRegion* R,
const FieldDecl* D;
public:
- SymbolDataField(SymbolID MySym, const MemRegion* r, const FieldDecl* d)
+ SymbolDataField(SymbolRef MySym, const MemRegion* r, const FieldDecl* d)
: SymbolData(FieldKind, MySym), R(r), D(d) {}
static void Profile(llvm::FoldingSetNodeID& profile, const MemRegion* R,
unsigned Count;
public:
- SymbolConjured(SymbolID Sym, Stmt* s, QualType t, unsigned count)
+ SymbolConjured(SymbolRef Sym, Stmt* s, QualType t, unsigned count)
: SymbolData(ConjuredKind, Sym), S(s), T(t), Count(count) {}
Stmt* getStmt() const { return S; }
// Constraints on symbols. Usually wrapped by SValues.
class SymIntConstraint : public llvm::FoldingSetNode {
- SymbolID Symbol;
+ SymbolRef Symbol;
BinaryOperator::Opcode Op;
const llvm::APSInt& Val;
public:
- SymIntConstraint(SymbolID sym, BinaryOperator::Opcode op,
+ SymIntConstraint(SymbolRef sym, BinaryOperator::Opcode op,
const llvm::APSInt& V)
: Symbol(sym),
Op(op), Val(V) {}
BinaryOperator::Opcode getOpcode() const { return Op; }
- const SymbolID& getSymbol() const { return Symbol; }
+ const SymbolRef& getSymbol() const { return Symbol; }
const llvm::APSInt& getInt() const { return Val; }
static inline void Profile(llvm::FoldingSetNodeID& ID,
- SymbolID Symbol,
+ SymbolRef Symbol,
BinaryOperator::Opcode Op,
const llvm::APSInt& Val) {
Symbol.Profile(ID);
class SymbolManager {
typedef llvm::FoldingSet<SymbolData> DataSetTy;
- typedef llvm::DenseMap<SymbolID, SymbolData*> DataMapTy;
+ typedef llvm::DenseMap<SymbolRef, SymbolData*> DataMapTy;
DataSetTy DataSet;
DataMapTy DataMap;
~SymbolManager();
- SymbolID getSymbol(VarDecl* D);
- SymbolID getElementSymbol(const MemRegion* R, const llvm::APSInt* Idx);
- SymbolID getFieldSymbol(const MemRegion* R, const FieldDecl* D);
- SymbolID getConjuredSymbol(Stmt* E, QualType T, unsigned VisitCount);
- SymbolID getConjuredSymbol(Expr* E, unsigned VisitCount) {
+ SymbolRef getSymbol(VarDecl* D);
+ SymbolRef getElementSymbol(const MemRegion* R, const llvm::APSInt* Idx);
+ SymbolRef getFieldSymbol(const MemRegion* R, const FieldDecl* D);
+ SymbolRef getConjuredSymbol(Stmt* E, QualType T, unsigned VisitCount);
+ SymbolRef getConjuredSymbol(Expr* E, unsigned VisitCount) {
return getConjuredSymbol(E, E->getType(), VisitCount);
}
- const SymbolData& getSymbolData(SymbolID ID) const;
+ const SymbolData& getSymbolData(SymbolRef ID) const;
- QualType getType(SymbolID ID) const {
+ QualType getType(SymbolRef ID) const {
return getSymbolData(ID).getType(*this);
}
};
namespace {
-typedef llvm::ImmutableMap<SymbolID,GRState::IntSetTy> ConstNotEqTy;
-typedef llvm::ImmutableMap<SymbolID,const llvm::APSInt*> ConstEqTy;
+typedef llvm::ImmutableMap<SymbolRef,GRState::IntSetTy> ConstNotEqTy;
+typedef llvm::ImmutableMap<SymbolRef,const llvm::APSInt*> ConstEqTy;
// BasicConstraintManager only tracks equality and inequality constraints of
// constants and integer variables.
const GRState* AssumeSymInt(const GRState* St, bool Assumption,
const SymIntConstraint& C, bool& isFeasible);
- const GRState* AssumeSymNE(const GRState* St, SymbolID sym,
+ const GRState* AssumeSymNE(const GRState* St, SymbolRef sym,
const llvm::APSInt& V, bool& isFeasible);
- const GRState* AssumeSymEQ(const GRState* St, SymbolID sym,
+ const GRState* AssumeSymEQ(const GRState* St, SymbolRef sym,
const llvm::APSInt& V, bool& isFeasible);
- const GRState* AssumeSymLT(const GRState* St, SymbolID sym,
+ const GRState* AssumeSymLT(const GRState* St, SymbolRef sym,
const llvm::APSInt& V, bool& isFeasible);
- const GRState* AssumeSymGT(const GRState* St, SymbolID sym,
+ const GRState* AssumeSymGT(const GRState* St, SymbolRef sym,
const llvm::APSInt& V, bool& isFeasible);
- const GRState* AssumeSymGE(const GRState* St, SymbolID sym,
+ const GRState* AssumeSymGE(const GRState* St, SymbolRef sym,
const llvm::APSInt& V, bool& isFeasible);
- const GRState* AssumeSymLE(const GRState* St, SymbolID sym,
+ const GRState* AssumeSymLE(const GRState* St, SymbolRef sym,
const llvm::APSInt& V, bool& isFeasible);
const GRState* AssumeInBound(const GRState* St, SVal Idx, SVal UpperBound,
bool Assumption, bool& isFeasible);
- const GRState* AddEQ(const GRState* St, SymbolID sym, const llvm::APSInt& V);
+ const GRState* AddEQ(const GRState* St, SymbolRef sym, const llvm::APSInt& V);
- const GRState* AddNE(const GRState* St, SymbolID sym, const llvm::APSInt& V);
+ const GRState* AddNE(const GRState* St, SymbolRef sym, const llvm::APSInt& V);
- const llvm::APSInt* getSymVal(const GRState* St, SymbolID sym);
- bool isNotEqual(const GRState* St, SymbolID sym, const llvm::APSInt& V) const;
- bool isEqual(const GRState* St, SymbolID sym, const llvm::APSInt& V) const;
+ const llvm::APSInt* getSymVal(const GRState* St, SymbolRef sym);
+ bool isNotEqual(const GRState* St, SymbolRef sym, const llvm::APSInt& V) const;
+ bool isEqual(const GRState* St, SymbolRef sym, const llvm::APSInt& V) const;
const GRState* RemoveDeadBindings(const GRState* St,
StoreManager::LiveSymbolsTy& LSymbols,
case nonloc::SymbolValKind: {
nonloc::SymbolVal& SV = cast<nonloc::SymbolVal>(Cond);
- SymbolID sym = SV.getSymbol();
+ SymbolRef sym = SV.getSymbol();
if (Assumption)
return AssumeSymNE(St, sym, BasicVals.getValue(0, SymMgr.getType(sym)),
}
const GRState*
-BasicConstraintManager::AssumeSymNE(const GRState* St, SymbolID sym,
+BasicConstraintManager::AssumeSymNE(const GRState* St, SymbolRef sym,
const llvm::APSInt& V, bool& isFeasible) {
// First, determine if sym == X, where X != V.
if (const llvm::APSInt* X = getSymVal(St, sym)) {
}
const GRState*
-BasicConstraintManager::AssumeSymEQ(const GRState* St, SymbolID sym,
+BasicConstraintManager::AssumeSymEQ(const GRState* St, SymbolRef sym,
const llvm::APSInt& V, bool& isFeasible) {
// First, determine if sym == X, where X != V.
if (const llvm::APSInt* X = getSymVal(St, sym)) {
// These logic will be handled in another ConstraintManager.
const GRState*
-BasicConstraintManager::AssumeSymLT(const GRState* St, SymbolID sym,
+BasicConstraintManager::AssumeSymLT(const GRState* St, SymbolRef sym,
const llvm::APSInt& V, bool& isFeasible) {
// Is 'V' the smallest possible value?
}
const GRState*
-BasicConstraintManager::AssumeSymGT(const GRState* St, SymbolID sym,
+BasicConstraintManager::AssumeSymGT(const GRState* St, SymbolRef sym,
const llvm::APSInt& V, bool& isFeasible) {
// Is 'V' the largest possible value?
}
const GRState*
-BasicConstraintManager::AssumeSymGE(const GRState* St, SymbolID sym,
+BasicConstraintManager::AssumeSymGE(const GRState* St, SymbolRef sym,
const llvm::APSInt& V, bool& isFeasible) {
// Reject a path if the value of sym is a constant X and !(X >= V).
}
const GRState*
-BasicConstraintManager::AssumeSymLE(const GRState* St, SymbolID sym,
+BasicConstraintManager::AssumeSymLE(const GRState* St, SymbolRef sym,
const llvm::APSInt& V, bool& isFeasible) {
// Reject a path if the value of sym is a constant X and !(X <= V).
};
}
-const GRState* BasicConstraintManager::AddEQ(const GRState* St, SymbolID sym,
+const GRState* BasicConstraintManager::AddEQ(const GRState* St, SymbolRef sym,
const llvm::APSInt& V) {
// Create a new state with the old binding replaced.
GRStateRef state(St, StateMgr);
return state.set<ConstEqTy>(sym, &V);
}
-const GRState* BasicConstraintManager::AddNE(const GRState* St, SymbolID sym,
+const GRState* BasicConstraintManager::AddNE(const GRState* St, SymbolRef sym,
const llvm::APSInt& V) {
GRStateRef state(St, StateMgr);
}
const llvm::APSInt* BasicConstraintManager::getSymVal(const GRState* St,
- SymbolID sym) {
+ SymbolRef sym) {
const ConstEqTy::data_type* T = St->get<ConstEqTy>(sym);
return T ? *T : NULL;
}
-bool BasicConstraintManager::isNotEqual(const GRState* St, SymbolID sym,
+bool BasicConstraintManager::isNotEqual(const GRState* St, SymbolRef sym,
const llvm::APSInt& V) const {
// Retrieve the NE-set associated with the given symbol.
return T ? T->contains(&V) : false;
}
-bool BasicConstraintManager::isEqual(const GRState* St, SymbolID sym,
+bool BasicConstraintManager::isEqual(const GRState* St, SymbolRef sym,
const llvm::APSInt& V) const {
// Retrieve the EQ-set associated with the given symbol.
const ConstEqTy::data_type* T = St->get<ConstEqTy>(sym);
ConstEqTy::Factory& CEFactory = state.get_context<ConstEqTy>();
for (ConstEqTy::iterator I = CE.begin(), E = CE.end(); I!=E; ++I) {
- SymbolID sym = I.getKey();
+ SymbolRef sym = I.getKey();
if (!LSymbols.count(sym)) {
DSymbols.insert(sym);
CE = CEFactory.Remove(CE, sym);
ConstNotEqTy::Factory& CNEFactory = state.get_context<ConstNotEqTy>();
for (ConstNotEqTy::iterator I = CNE.begin(), E = CNE.end(); I != E; ++I) {
- SymbolID sym = I.getKey();
+ SymbolRef sym = I.getKey();
if (!LSymbols.count(sym)) {
DSymbols.insert(sym);
CNE = CNEFactory.Remove(CNE, sym);
}
const SymIntConstraint&
-BasicValueFactory::getConstraint(SymbolID sym, BinaryOperator::Opcode Op,
+BasicValueFactory::getConstraint(SymbolRef sym, BinaryOperator::Opcode Op,
const llvm::APSInt& V) {
llvm::FoldingSetNodeID ID;
class VISIBILITY_HIDDEN NotableSymbolHandler
: public StoreManager::BindingsHandler {
- SymbolID Sym;
+ SymbolRef Sym;
const GRState* PrevSt;
Stmt* S;
GRStateManager& VMgr;
public:
- NotableSymbolHandler(SymbolID sym, const GRState* prevst, Stmt* s,
+ NotableSymbolHandler(SymbolRef sym, const GRState* prevst, Stmt* s,
GRStateManager& vmgr, ExplodedNode<GRState>* pred,
PathDiagnostic& pd, BugReporter& br)
: Sym(sym), PrevSt(prevst), S(s), VMgr(vmgr), Pred(pred), PD(pd), BR(br) {}
bool HandleBinding(StoreManager& SMgr, Store store, MemRegion* R, SVal V) {
- SymbolID ScanSym;
+ SymbolRef ScanSym;
if (loc::SymbolVal* SV = dyn_cast<loc::SymbolVal>(&V))
ScanSym = SV->getSymbol();
}
static void HandleNotableSymbol(ExplodedNode<GRState>* N, Stmt* S,
- SymbolID Sym, BugReporter& BR,
+ SymbolRef Sym, BugReporter& BR,
PathDiagnostic& PD) {
ExplodedNode<GRState>* Pred = N->pred_empty() ? 0 : *N->pred_begin();
class VISIBILITY_HIDDEN ScanNotableSymbols
: public StoreManager::BindingsHandler {
- llvm::SmallSet<SymbolID, 10> AlreadyProcessed;
+ llvm::SmallSet<SymbolRef, 10> AlreadyProcessed;
ExplodedNode<GRState>* N;
Stmt* S;
GRBugReporter& BR;
: N(n), S(s), BR(br), PD(pd) {}
bool HandleBinding(StoreManager& SMgr, Store store, MemRegion* R, SVal V) {
- SymbolID ScanSym;
+ SymbolRef ScanSym;
if (loc::SymbolVal* SV = dyn_cast<loc::SymbolVal>(&V))
ScanSym = SV->getSymbol();
// RefBindings - State used to track object reference counts.
//===----------------------------------------------------------------------===//
-typedef llvm::ImmutableMap<SymbolID, RefVal> RefBindings;
+typedef llvm::ImmutableMap<SymbolRef, RefVal> RefBindings;
static int RefBIndex = 0;
namespace clang {
// ARBindings - State used to track objects in autorelease pools.
//===----------------------------------------------------------------------===//
-typedef llvm::ImmutableSet<SymbolID> ARPoolContents;
-typedef llvm::ImmutableList< std::pair<SymbolID, ARPoolContents*> > ARBindings;
+typedef llvm::ImmutableSet<SymbolRef> ARPoolContents;
+typedef llvm::ImmutableList< std::pair<SymbolRef, ARPoolContents*> > ARBindings;
static int AutoRBIndex = 0;
namespace clang {
class VISIBILITY_HIDDEN CFRefCount : public GRSimpleVals {
public:
// Type definitions.
- typedef llvm::DenseMap<GRExprEngine::NodeTy*,std::pair<Expr*, SymbolID> >
+ typedef llvm::DenseMap<GRExprEngine::NodeTy*,std::pair<Expr*, SymbolRef> >
ReleasesNotOwnedTy;
typedef ReleasesNotOwnedTy UseAfterReleasesTy;
typedef llvm::DenseMap<GRExprEngine::NodeTy*,
- std::vector<std::pair<SymbolID,bool> >*>
+ std::vector<std::pair<SymbolRef,bool> >*>
LeaksTy;
class BindingsPrinter : public GRState::Printer {
ReleasesNotOwnedTy ReleasesNotOwned;
LeaksTy Leaks;
- RefBindings Update(RefBindings B, SymbolID sym, RefVal V, ArgEffect E,
+ RefBindings Update(RefBindings B, SymbolRef sym, RefVal V, ArgEffect E,
RefVal::Kind& hasErr, RefBindings::Factory& RefBFactory);
- RefVal::Kind& Update(GRStateRef& state, SymbolID sym, RefVal V,
+ RefVal::Kind& Update(GRStateRef& state, SymbolRef sym, RefVal V,
ArgEffect E, RefVal::Kind& hasErr) {
state = state.set<RefBindings>(Update(state.get<RefBindings>(), sym, V,
Expr* NodeExpr, Expr* ErrorExpr,
ExplodedNode<GRState>* Pred,
const GRState* St,
- RefVal::Kind hasErr, SymbolID Sym);
+ RefVal::Kind hasErr, SymbolRef Sym);
std::pair<GRStateRef, bool>
HandleSymbolDeath(GRStateManager& VMgr, const GRState* St,
- const Decl* CD, SymbolID sid, RefVal V, bool& hasLeak);
+ const Decl* CD, SymbolRef sid, RefVal V, bool& hasLeak);
public:
Expr* NodeExpr, Expr* ErrorExpr,
ExplodedNode<GRState>* Pred,
const GRState* St,
- RefVal::Kind hasErr, SymbolID Sym) {
+ RefVal::Kind hasErr, SymbolRef Sym) {
Builder.BuildSinks = true;
GRExprEngine::NodeTy* N = Builder.MakeNode(Dst, NodeExpr, Pred, St);
RefVal::Kind hasErr = (RefVal::Kind) 0;
unsigned idx = 0;
Expr* ErrorExpr = NULL;
- SymbolID ErrorSym = 0;
+ SymbolRef ErrorSym = 0;
for (ExprIterator I = arg_beg; I != arg_end; ++I, ++idx) {
SVal V = state.GetSVal(*I);
if (isa<loc::SymbolVal>(V)) {
- SymbolID Sym = cast<loc::SymbolVal>(V).getSymbol();
+ SymbolRef Sym = cast<loc::SymbolVal>(V).getSymbol();
if (RefBindings::data_type* T = state.get<RefBindings>(Sym))
if (Update(state, Sym, *T, GetArgE(Summ, idx), hasErr)) {
ErrorExpr = *I;
SVal X = state.GetSVal(*MR);
if (isa<loc::SymbolVal>(X)) {
- SymbolID Sym = cast<loc::SymbolVal>(X).getSymbol();
+ SymbolRef Sym = cast<loc::SymbolVal>(X).getSymbol();
state = state.remove<RefBindings>(Sym);
}
// FIXME: handle structs.
if (Loc::IsLocType(T) || (T->isIntegerType() && T->isScalarType())) {
- SymbolID NewSym =
+ SymbolRef NewSym =
Eng.getSymbolManager().getConjuredSymbol(*I, T, Count);
state = state.BindLoc(*MR,
if (!ErrorExpr && Receiver) {
SVal V = state.GetSVal(Receiver);
if (isa<loc::SymbolVal>(V)) {
- SymbolID Sym = cast<loc::SymbolVal>(V).getSymbol();
+ SymbolRef Sym = cast<loc::SymbolVal>(V).getSymbol();
if (const RefVal* T = state.get<RefBindings>(Sym))
if (Update(state, Sym, *T, GetReceiverE(Summ), hasErr)) {
ErrorExpr = Receiver;
if (Loc::IsLocType(T) || (T->isIntegerType() && T->isScalarType())) {
unsigned Count = Builder.getCurrentBlockCount();
- SymbolID Sym = Eng.getSymbolManager().getConjuredSymbol(Ex, Count);
+ SymbolRef Sym = Eng.getSymbolManager().getConjuredSymbol(Ex, Count);
SVal X = Loc::IsLocType(Ex->getType())
? cast<SVal>(loc::SymbolVal(Sym))
case RetEffect::OwnedAllocatedSymbol:
case RetEffect::OwnedSymbol: {
unsigned Count = Builder.getCurrentBlockCount();
- SymbolID Sym = Eng.getSymbolManager().getConjuredSymbol(Ex, Count);
+ SymbolRef Sym = Eng.getSymbolManager().getConjuredSymbol(Ex, Count);
QualType RetT = GetReturnType(Ex, Eng.getContext());
state = state.set<RefBindings>(Sym, RefVal::makeOwned(RetT));
case RetEffect::NotOwnedSymbol: {
unsigned Count = Builder.getCurrentBlockCount();
- SymbolID Sym = Eng.getSymbolManager().getConjuredSymbol(Ex, Count);
+ SymbolRef Sym = Eng.getSymbolManager().getConjuredSymbol(Ex, Count);
QualType RetT = GetReturnType(Ex, Eng.getContext());
state = state.set<RefBindings>(Sym, RefVal::makeNotOwned(RetT));
SVal V = Eng.getStateManager().GetSVal(St, Receiver );
if (isa<loc::SymbolVal>(V)) {
- SymbolID Sym = cast<loc::SymbolVal>(V).getSymbol();
+ SymbolRef Sym = cast<loc::SymbolVal>(V).getSymbol();
if (const RefVal* T = St->get<RefBindings>(Sym)) {
QualType Ty = T->getType();
// (3) we are binding to a memregion with stack storage that the store
// does not understand.
- SymbolID Sym = cast<loc::SymbolVal>(Val).getSymbol();
+ SymbolRef Sym = cast<loc::SymbolVal>(Val).getSymbol();
GRStateRef state(St, Eng.getStateManager());
if (!isa<loc::MemRegionVal>(TargetLV))
std::pair<GRStateRef,bool>
CFRefCount::HandleSymbolDeath(GRStateManager& VMgr,
const GRState* St, const Decl* CD,
- SymbolID sid,
+ SymbolRef sid,
RefVal V, bool& hasLeak) {
GRStateRef state(St, VMgr);
const GRState* St = Builder.getState();
RefBindings B = St->get<RefBindings>();
- llvm::SmallVector<std::pair<SymbolID, bool>, 10> Leaked;
+ llvm::SmallVector<std::pair<SymbolRef, bool>, 10> Leaked;
const Decl* CodeDecl = &Eng.getGraph().getCodeDecl();
for (RefBindings::iterator I = B.begin(), E = B.end(); I != E; ++I) {
if (!N)
return;
- std::vector<std::pair<SymbolID,bool> >*& LeaksAtNode = Leaks[N];
+ std::vector<std::pair<SymbolRef,bool> >*& LeaksAtNode = Leaks[N];
assert (!LeaksAtNode);
- LeaksAtNode = new std::vector<std::pair<SymbolID,bool> >();
+ LeaksAtNode = new std::vector<std::pair<SymbolRef,bool> >();
- for (llvm::SmallVector<std::pair<SymbolID,bool>, 10>::iterator
+ for (llvm::SmallVector<std::pair<SymbolRef,bool>, 10>::iterator
I = Leaked.begin(), E = Leaked.end(); I != E; ++I)
(*LeaksAtNode).push_back(*I);
}
// FIXME: a lot of copy-and-paste from EvalEndPath. Refactor.
RefBindings B = St->get<RefBindings>();
- llvm::SmallVector<std::pair<SymbolID,bool>, 10> Leaked;
+ llvm::SmallVector<std::pair<SymbolRef,bool>, 10> Leaked;
for (GRStateManager::DeadSymbolsTy::const_iterator
I=Dead.begin(), E=Dead.end(); I!=E; ++I) {
if (!N)
return;
- std::vector<std::pair<SymbolID,bool> >*& LeaksAtNode = Leaks[N];
+ std::vector<std::pair<SymbolRef,bool> >*& LeaksAtNode = Leaks[N];
assert (!LeaksAtNode);
- LeaksAtNode = new std::vector<std::pair<SymbolID,bool> >();
+ LeaksAtNode = new std::vector<std::pair<SymbolRef,bool> >();
- for (llvm::SmallVector<std::pair<SymbolID,bool>, 10>::iterator
+ for (llvm::SmallVector<std::pair<SymbolRef,bool>, 10>::iterator
I = Leaked.begin(), E = Leaked.end(); I != E; ++I)
(*LeaksAtNode).push_back(*I);
}
return;
// Get the reference count binding (if any).
- SymbolID Sym = cast<loc::SymbolVal>(V).getSymbol();
+ SymbolRef Sym = cast<loc::SymbolVal>(V).getSymbol();
const RefVal* T = state.get<RefBindings>(Sym);
if (!T)
return state;
}
-RefBindings CFRefCount::Update(RefBindings B, SymbolID sym,
+RefBindings CFRefCount::Update(RefBindings B, SymbolRef sym,
RefVal V, ArgEffect E,
RefVal::Kind& hasErr,
RefBindings::Factory& RefBFactory) {
//===---------===//
class VISIBILITY_HIDDEN CFRefReport : public RangedBugReport {
- SymbolID Sym;
+ SymbolRef Sym;
public:
- CFRefReport(CFRefBug& D, ExplodedNode<GRState> *n, SymbolID sym)
+ CFRefReport(CFRefBug& D, ExplodedNode<GRState> *n, SymbolRef sym)
: RangedBugReport(D, n), Sym(sym) {}
virtual ~CFRefReport() {}
beg = end = 0;
}
- SymbolID getSymbol() const { return Sym; }
+ SymbolRef getSymbol() const { return Sym; }
virtual PathDiagnosticPiece* getEndPath(BugReporter& BR,
ExplodedNode<GRState>* N);
namespace {
class VISIBILITY_HIDDEN FindUniqueBinding :
public StoreManager::BindingsHandler {
- SymbolID Sym;
+ SymbolRef Sym;
MemRegion* Binding;
bool First;
public:
- FindUniqueBinding(SymbolID sym) : Sym(sym), Binding(0), First(true) {}
+ FindUniqueBinding(SymbolRef sym) : Sym(sym), Binding(0), First(true) {}
bool HandleBinding(StoreManager& SMgr, Store store, MemRegion* R, SVal val) {
if (const loc::SymbolVal* SV = dyn_cast<loc::SymbolVal>(&val)) {
static std::pair<ExplodedNode<GRState>*,MemRegion*>
GetAllocationSite(GRStateManager* StateMgr, ExplodedNode<GRState>* N,
- SymbolID Sym) {
+ SymbolRef Sym) {
// Find both first node that referred to the tracked symbol and the
// memory location that value was store to.
for (CFRefCount::leaks_iterator I = TF.leaks_begin(),
E = TF.leaks_end(); I != E; ++I) {
- std::vector<std::pair<SymbolID, bool> >& SymV = *(I->second);
+ std::vector<std::pair<SymbolRef, bool> >& SymV = *(I->second);
unsigned n = SymV.size();
for (unsigned i = 0; i < n; ++i) {
// With leaks, we want to unique them by the location where they were
// allocated, and only report a single path.
- SymbolID Sym = static_cast<CFRefReport&>(R).getSymbol();
+ SymbolRef Sym = static_cast<CFRefReport&>(R).getSymbol();
ExplodedNode<GRState>* AllocNode =
GetAllocationSite(0, R.getEndNode(), Sym).first;
// UnknownVal.
if (InitVal.isUnknown()) {
if (Loc::IsLocType(T)) {
- SymbolID Sym = SymMgr.getConjuredSymbol(InitEx, Count);
+ SymbolRef Sym = SymMgr.getConjuredSymbol(InitEx, Count);
InitVal = loc::SymbolVal(Sym);
}
else if (T->isIntegerType() && T->isScalarType()) {
- SymbolID Sym = SymMgr.getConjuredSymbol(InitEx, Count);
+ SymbolRef Sym = SymMgr.getConjuredSymbol(InitEx, Count);
InitVal = nonloc::SymbolVal(Sym);
}
}
if (RightV.isUnknown() && (Loc::IsLocType(T) ||
(T->isScalarType() && T->isIntegerType()))) {
unsigned Count = Builder->getCurrentBlockCount();
- SymbolID Sym = SymMgr.getConjuredSymbol(B->getRHS(), Count);
+ SymbolRef Sym = SymMgr.getConjuredSymbol(B->getRHS(), Count);
RightV = Loc::IsLocType(T)
? cast<SVal>(loc::SymbolVal(Sym))
// The symbolic value is actually for the type of the left-hand side
// expression, not the computation type, as this is the value the
// LValue on the LHS will bind to.
- SymbolID Sym = SymMgr.getConjuredSymbol(B->getRHS(), LTy, Count);
+ SymbolRef Sym = SymMgr.getConjuredSymbol(B->getRHS(), LTy, Count);
LHSVal = Loc::IsLocType(LTy)
? cast<SVal>(loc::SymbolVal(Sym))
: cast<SVal>(nonloc::SymbolVal(Sym));
QualType T = CE->getType();
if (Loc::IsLocType(T) || (T->isIntegerType() && T->isScalarType())) {
unsigned Count = Builder.getCurrentBlockCount();
- SymbolID Sym = Eng.getSymbolManager().getConjuredSymbol(CE, Count);
+ SymbolRef Sym = Eng.getSymbolManager().getConjuredSymbol(CE, Count);
SVal X = Loc::IsLocType(CE->getType())
? cast<SVal>(loc::SymbolVal(Sym))
//
//===----------------------------------------------------------------------===//
//
-// This file defines SymbolID, ExprBindKey, and GRState*
+// This file defines SymbolRef, ExprBindKey, and GRState*
//
//===----------------------------------------------------------------------===//
DeclRegion::ProfileRegion(ID, D, superRegion, getKind());
}
-void SymbolicRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolID sym) {
+void SymbolicRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym) {
ID.AddInteger((unsigned) MemRegion::SymbolicRegionKind);
ID.AddInteger(sym.getNumber());
}
}
/// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
-SymbolicRegion* MemRegionManager::getSymbolicRegion(const SymbolID sym) {
+SymbolicRegion* MemRegionManager::getSymbolicRegion(const SymbolRef sym) {
llvm::FoldingSetNodeID ID;
SymbolicRegion::ProfileRegion(ID, sym);
// Mark all non-live symbols that this region references as dead.
if (const SymbolicRegion* SymR = dyn_cast<SymbolicRegion>(R)) {
- SymbolID Sym = SymR->getSymbol();
+ SymbolRef Sym = SymR->getSymbol();
if (!LSymbols.count(Sym)) DSymbols.insert(Sym);
}
// FIXME: This is a rat's nest. Cleanup.
if (isa<loc::SymbolVal>(this))
- return symbol_iterator(SymbolID((uintptr_t)Data));
+ return symbol_iterator(SymbolRef((uintptr_t)Data));
else if (isa<nonloc::SymbolVal>(this))
- return symbol_iterator(SymbolID((uintptr_t)Data));
+ return symbol_iterator(SymbolRef((uintptr_t)Data));
else if (isa<nonloc::SymIntConstraintVal>(this)) {
const SymIntConstraint& C =
cast<nonloc::SymIntConstraintVal>(this)->getConstraint();
using namespace clang;
-SymbolID SymbolManager::getSymbol(VarDecl* D) {
+SymbolRef SymbolManager::getSymbol(VarDecl* D) {
assert (isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D) ||
D->hasGlobalStorage());
return SymbolCounter++;
}
-SymbolID SymbolManager::getElementSymbol(const MemRegion* R,
+SymbolRef SymbolManager::getElementSymbol(const MemRegion* R,
const llvm::APSInt* Idx){
llvm::FoldingSetNodeID ID;
SymbolDataElement::Profile(ID, R, Idx);
return SymbolCounter++;
}
-SymbolID SymbolManager::getFieldSymbol(const MemRegion* R, const FieldDecl* D) {
+SymbolRef SymbolManager::getFieldSymbol(const MemRegion* R, const FieldDecl* D) {
llvm::FoldingSetNodeID ID;
SymbolDataField::Profile(ID, R, D);
void* InsertPos;
return SymbolCounter++;
}
-SymbolID SymbolManager::getConjuredSymbol(Stmt* E, QualType T, unsigned Count) {
+SymbolRef SymbolManager::getConjuredSymbol(Stmt* E, QualType T, unsigned Count) {
llvm::FoldingSetNodeID profile;
SymbolConjured::Profile(profile, E, T, Count);
return SymbolCounter++;
}
-const SymbolData& SymbolManager::getSymbolData(SymbolID Sym) const {
+const SymbolData& SymbolManager::getSymbolData(SymbolRef Sym) const {
DataMapTy::const_iterator I = DataMap.find(Sym);
assert (I != DataMap.end());
return *I->second;