forked from OSchip/llvm-project
Rename IsPointerType to LVal::IsLValType, and update CFRefCount::EvalSummary to use IsLValType when conjuring symbols for return values (this fixes a bug with an assertion firing in the analyzer when two qualified objective-c types were compared).
llvm-svn: 50924
This commit is contained in:
parent
fa8e15bfa5
commit
acdde6f099
|
@ -648,18 +648,6 @@ protected:
|
||||||
|
|
||||||
ValueState* MarkBranch(ValueState* St, Stmt* Terminator, bool branchTaken);
|
ValueState* MarkBranch(ValueState* St, Stmt* Terminator, bool branchTaken);
|
||||||
};
|
};
|
||||||
} // end clang namespace
|
|
||||||
|
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
// Utility
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
|
|
||||||
namespace clang {
|
|
||||||
|
|
||||||
static inline bool IsPointerType(QualType T) {
|
|
||||||
return T->isPointerType() || T->isObjCQualifiedIdType();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // end clang namespace
|
} // end clang namespace
|
||||||
|
|
||||||
|
|
|
@ -157,6 +157,10 @@ public:
|
||||||
static inline bool classof(const RVal* V) {
|
static inline bool classof(const RVal* V) {
|
||||||
return V->getBaseKind() == LValKind;
|
return V->getBaseKind() == LValKind;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool IsLValType(QualType T) {
|
||||||
|
return T->isPointerType() || T->isObjCQualifiedIdType();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//==------------------------------------------------------------------------==//
|
//==------------------------------------------------------------------------==//
|
||||||
|
|
|
@ -1230,7 +1230,7 @@ void CFRefCount::EvalSummary(ExplodedNodeSet<ValueState>& Dst,
|
||||||
unsigned Count = Builder.getCurrentBlockCount();
|
unsigned Count = Builder.getCurrentBlockCount();
|
||||||
SymbolID Sym = Eng.getSymbolManager().getConjuredSymbol(Ex, Count);
|
SymbolID Sym = Eng.getSymbolManager().getConjuredSymbol(Ex, Count);
|
||||||
|
|
||||||
RVal X = Ex->getType()->isPointerType()
|
RVal X = LVal::IsLValType(Ex->getType())
|
||||||
? cast<RVal>(lval::SymbolVal(Sym))
|
? cast<RVal>(lval::SymbolVal(Sym))
|
||||||
: cast<RVal>(nonlval::SymbolVal(Sym));
|
: cast<RVal>(nonlval::SymbolVal(Sym));
|
||||||
|
|
||||||
|
|
|
@ -795,7 +795,7 @@ void GRExprEngine::VisitArraySubscriptExpr(ArraySubscriptExpr* A, NodeTy* Pred,
|
||||||
// abstract address of the base object.
|
// abstract address of the base object.
|
||||||
NodeSet Tmp;
|
NodeSet Tmp;
|
||||||
|
|
||||||
if (IsPointerType(Base->getType())) // Base always is an LVal.
|
if (LVal::IsLValType(Base->getType())) // Base always is an LVal.
|
||||||
Visit(Base, Pred, Tmp);
|
Visit(Base, Pred, Tmp);
|
||||||
else
|
else
|
||||||
VisitLVal(Base, Pred, Tmp);
|
VisitLVal(Base, Pred, Tmp);
|
||||||
|
@ -842,7 +842,7 @@ void GRExprEngine::VisitMemberExpr(MemberExpr* M, NodeTy* Pred,
|
||||||
|
|
||||||
if (asLVal) {
|
if (asLVal) {
|
||||||
|
|
||||||
if (IsPointerType(Base->getType())) // Base always is an LVal.
|
if (LVal::IsLValType(Base->getType())) // Base always is an LVal.
|
||||||
Visit(Base, Pred, Tmp);
|
Visit(Base, Pred, Tmp);
|
||||||
else
|
else
|
||||||
VisitLVal(Base, Pred, Tmp);
|
VisitLVal(Base, Pred, Tmp);
|
||||||
|
@ -869,7 +869,7 @@ void GRExprEngine::VisitMemberExpr(MemberExpr* M, NodeTy* Pred,
|
||||||
ValueState* St = GetState(*I);
|
ValueState* St = GetState(*I);
|
||||||
RVal BaseV = GetRVal(St, Base);
|
RVal BaseV = GetRVal(St, Base);
|
||||||
|
|
||||||
if (IsPointerType(Base->getType())) {
|
if (LVal::IsLValType(Base->getType())) {
|
||||||
|
|
||||||
assert (M->isArrow());
|
assert (M->isArrow());
|
||||||
|
|
||||||
|
@ -1389,7 +1389,7 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for casts from pointers to integers.
|
// Check for casts from pointers to integers.
|
||||||
if (T->isIntegerType() && IsPointerType(ExTy)) {
|
if (T->isIntegerType() && LVal::IsLValType(ExTy)) {
|
||||||
unsigned bits = getContext().getTypeSize(ExTy);
|
unsigned bits = getContext().getTypeSize(ExTy);
|
||||||
|
|
||||||
// FIXME: Determine if the number of bits of the target type is
|
// FIXME: Determine if the number of bits of the target type is
|
||||||
|
@ -1402,7 +1402,7 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for casts from integers to pointers.
|
// Check for casts from integers to pointers.
|
||||||
if (IsPointerType(T) && ExTy->isIntegerType())
|
if (LVal::IsLValType(T) && ExTy->isIntegerType())
|
||||||
if (nonlval::LValAsInteger *LV = dyn_cast<nonlval::LValAsInteger>(&V)) {
|
if (nonlval::LValAsInteger *LV = dyn_cast<nonlval::LValAsInteger>(&V)) {
|
||||||
// Just unpackage the lval and return it.
|
// Just unpackage the lval and return it.
|
||||||
V = LV->getLVal();
|
V = LV->getLVal();
|
||||||
|
@ -1481,7 +1481,7 @@ void GRExprEngine::VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
|
||||||
|
|
||||||
QualType T = VD->getType();
|
QualType T = VD->getType();
|
||||||
|
|
||||||
if (IsPointerType(T))
|
if (LVal::IsLValType(T))
|
||||||
St = SetRVal(St, lval::DeclVal(VD),
|
St = SetRVal(St, lval::DeclVal(VD),
|
||||||
lval::ConcreteInt(BasicVals.getValue(0, T)));
|
lval::ConcreteInt(BasicVals.getValue(0, T)));
|
||||||
else if (T->isIntegerType())
|
else if (T->isIntegerType())
|
||||||
|
@ -1499,7 +1499,7 @@ void GRExprEngine::VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
|
||||||
|
|
||||||
QualType T = VD->getType();
|
QualType T = VD->getType();
|
||||||
|
|
||||||
if (IsPointerType(T) || T->isIntegerType()) {
|
if (LVal::IsLValType(T) || T->isIntegerType()) {
|
||||||
|
|
||||||
RVal V = Ex ? GetRVal(St, Ex) : UndefinedVal();
|
RVal V = Ex ? GetRVal(St, Ex) : UndefinedVal();
|
||||||
|
|
||||||
|
@ -1510,7 +1510,7 @@ void GRExprEngine::VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
|
||||||
unsigned Count = Builder->getCurrentBlockCount();
|
unsigned Count = Builder->getCurrentBlockCount();
|
||||||
SymbolID Sym = SymMgr.getConjuredSymbol(Ex, Count);
|
SymbolID Sym = SymMgr.getConjuredSymbol(Ex, Count);
|
||||||
|
|
||||||
V = IsPointerType(Ex->getType())
|
V = LVal::IsLValType(Ex->getType())
|
||||||
? cast<RVal>(lval::SymbolVal(Sym))
|
? cast<RVal>(lval::SymbolVal(Sym))
|
||||||
: cast<RVal>(nonlval::SymbolVal(Sym));
|
: cast<RVal>(nonlval::SymbolVal(Sym));
|
||||||
}
|
}
|
||||||
|
@ -1965,7 +1965,7 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B,
|
||||||
unsigned Count = Builder->getCurrentBlockCount();
|
unsigned Count = Builder->getCurrentBlockCount();
|
||||||
SymbolID Sym = SymMgr.getConjuredSymbol(B->getRHS(), Count);
|
SymbolID Sym = SymMgr.getConjuredSymbol(B->getRHS(), Count);
|
||||||
|
|
||||||
RightV = IsPointerType(B->getRHS()->getType())
|
RightV = LVal::IsLValType(B->getRHS()->getType())
|
||||||
? cast<RVal>(lval::SymbolVal(Sym))
|
? cast<RVal>(lval::SymbolVal(Sym))
|
||||||
: cast<RVal>(nonlval::SymbolVal(Sym));
|
: cast<RVal>(nonlval::SymbolVal(Sym));
|
||||||
}
|
}
|
||||||
|
|
|
@ -379,10 +379,10 @@ RVal GRSimpleVals::EvalCast(GRExprEngine& Eng, NonLVal X, QualType T) {
|
||||||
BasicValueFactory& BasicVals = Eng.getBasicVals();
|
BasicValueFactory& BasicVals = Eng.getBasicVals();
|
||||||
|
|
||||||
llvm::APSInt V = cast<nonlval::ConcreteInt>(X).getValue();
|
llvm::APSInt V = cast<nonlval::ConcreteInt>(X).getValue();
|
||||||
V.setIsUnsigned(T->isUnsignedIntegerType() || IsPointerType(T));
|
V.setIsUnsigned(T->isUnsignedIntegerType() || LVal::IsLValType(T));
|
||||||
V.extOrTrunc(Eng.getContext().getTypeSize(T));
|
V.extOrTrunc(Eng.getContext().getTypeSize(T));
|
||||||
|
|
||||||
if (IsPointerType(T))
|
if (LVal::IsLValType(T))
|
||||||
return lval::ConcreteInt(BasicVals.getValue(V));
|
return lval::ConcreteInt(BasicVals.getValue(V));
|
||||||
else
|
else
|
||||||
return nonlval::ConcreteInt(BasicVals.getValue(V));
|
return nonlval::ConcreteInt(BasicVals.getValue(V));
|
||||||
|
@ -398,7 +398,7 @@ RVal GRSimpleVals::EvalCast(GRExprEngine& Eng, LVal X, QualType T) {
|
||||||
// can be introduced by the frontend for corner cases, e.g
|
// can be introduced by the frontend for corner cases, e.g
|
||||||
// casting from va_list* to __builtin_va_list&.
|
// casting from va_list* to __builtin_va_list&.
|
||||||
//
|
//
|
||||||
if (IsPointerType(T) || T->isReferenceType())
|
if (LVal::IsLValType(T) || T->isReferenceType())
|
||||||
return X;
|
return X;
|
||||||
|
|
||||||
assert (T->isIntegerType());
|
assert (T->isIntegerType());
|
||||||
|
@ -409,7 +409,7 @@ RVal GRSimpleVals::EvalCast(GRExprEngine& Eng, LVal X, QualType T) {
|
||||||
BasicValueFactory& BasicVals = Eng.getBasicVals();
|
BasicValueFactory& BasicVals = Eng.getBasicVals();
|
||||||
|
|
||||||
llvm::APSInt V = cast<lval::ConcreteInt>(X).getValue();
|
llvm::APSInt V = cast<lval::ConcreteInt>(X).getValue();
|
||||||
V.setIsUnsigned(T->isUnsignedIntegerType() || IsPointerType(T));
|
V.setIsUnsigned(T->isUnsignedIntegerType() || LVal::IsLValType(T));
|
||||||
V.extOrTrunc(Eng.getContext().getTypeSize(T));
|
V.extOrTrunc(Eng.getContext().getTypeSize(T));
|
||||||
|
|
||||||
return nonlval::ConcreteInt(BasicVals.getValue(V));
|
return nonlval::ConcreteInt(BasicVals.getValue(V));
|
||||||
|
@ -672,7 +672,7 @@ void GRSimpleVals::EvalCall(ExplodedNodeSet<ValueState>& Dst,
|
||||||
unsigned Count = Builder.getCurrentBlockCount();
|
unsigned Count = Builder.getCurrentBlockCount();
|
||||||
SymbolID Sym = Eng.getSymbolManager().getConjuredSymbol(CE, Count);
|
SymbolID Sym = Eng.getSymbolManager().getConjuredSymbol(CE, Count);
|
||||||
|
|
||||||
RVal X = IsPointerType(CE->getType())
|
RVal X = LVal::IsLValType(CE->getType())
|
||||||
? cast<RVal>(lval::SymbolVal(Sym))
|
? cast<RVal>(lval::SymbolVal(Sym))
|
||||||
: cast<RVal>(nonlval::SymbolVal(Sym));
|
: cast<RVal>(nonlval::SymbolVal(Sym));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue