зеркало из https://github.com/microsoft/clang-1.git
Teach the static analysis engine about ObjCQualifiedIdType.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50493 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
f47bb7851e
Коммит
036dce063a
|
@ -335,8 +335,7 @@ CFRefSummaryManager::getUnaryCFSummary(FunctionTypeProto* FT, CFUnaryFunc func)
|
|||
if (strcmp("CFTypeRef", TDName) != 0)
|
||||
return NULL;
|
||||
|
||||
if (!ArgT->isPointerType())
|
||||
return NULL;
|
||||
assert (ArgT->isPointerType() || ArgT->isObjCQualifiedIdType());
|
||||
|
||||
QualType RetTy = FT->getResultType();
|
||||
|
||||
|
|
|
@ -28,6 +28,10 @@ using llvm::dyn_cast;
|
|||
using llvm::cast;
|
||||
using llvm::APSInt;
|
||||
|
||||
static inline bool IsPointerType(QualType T) {
|
||||
return T->isPointerType() || T->isObjCQualifiedIdType();
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Engine construction and deletion.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -786,7 +790,7 @@ void GRExprEngine::VisitArraySubscriptExpr(ArraySubscriptExpr* A, NodeTy* Pred,
|
|||
// abstract address of the base object.
|
||||
NodeSet Tmp;
|
||||
|
||||
if (Base->getType()->isPointerType()) // Base always is an LVal.
|
||||
if (IsPointerType(Base->getType())) // Base always is an LVal.
|
||||
Visit(Base, Pred, Tmp);
|
||||
else
|
||||
VisitLVal(Base, Pred, Tmp);
|
||||
|
@ -823,7 +827,7 @@ void GRExprEngine::VisitMemberExpr(MemberExpr* M, NodeTy* Pred,
|
|||
// abstract address of the base object.
|
||||
NodeSet Tmp;
|
||||
|
||||
if (Base->getType()->isPointerType()) // Base always is an LVal.
|
||||
if (IsPointerType(Base->getType())) // Base always is an LVal.
|
||||
Visit(Base, Pred, Tmp);
|
||||
else
|
||||
VisitLVal(Base, Pred, Tmp);
|
||||
|
@ -1269,7 +1273,7 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
|
|||
}
|
||||
|
||||
// Check for casts from pointers to integers.
|
||||
if (T->isIntegerType() && ExTy->isPointerType()) {
|
||||
if (T->isIntegerType() && IsPointerType(ExTy)) {
|
||||
unsigned bits = getContext().getTypeSize(ExTy);
|
||||
|
||||
// FIXME: Determine if the number of bits of the target type is
|
||||
|
@ -1282,7 +1286,7 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
|
|||
}
|
||||
|
||||
// Check for casts from integers to pointers.
|
||||
if (T->isPointerType() && ExTy->isIntegerType())
|
||||
if (IsPointerType(T) && ExTy->isIntegerType())
|
||||
if (nonlval::LValAsInteger *LV = dyn_cast<nonlval::LValAsInteger>(&V)) {
|
||||
// Just unpackage the lval and return it.
|
||||
V = LV->getLVal();
|
||||
|
@ -1361,7 +1365,7 @@ void GRExprEngine::VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
|
|||
|
||||
QualType T = VD->getType();
|
||||
|
||||
if (T->isPointerType())
|
||||
if (IsPointerType(T))
|
||||
St = SetRVal(St, lval::DeclVal(VD),
|
||||
lval::ConcreteInt(BasicVals.getValue(0, T)));
|
||||
else if (T->isIntegerType())
|
||||
|
@ -1379,7 +1383,7 @@ void GRExprEngine::VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
|
|||
|
||||
QualType T = VD->getType();
|
||||
|
||||
if (T->isPointerType() || T->isIntegerType()) {
|
||||
if (IsPointerType(T) || T->isIntegerType()) {
|
||||
|
||||
RVal V = Ex ? GetRVal(St, Ex) : UndefinedVal();
|
||||
|
||||
|
@ -1390,7 +1394,7 @@ void GRExprEngine::VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
|
|||
unsigned Count = Builder->getCurrentBlockCount();
|
||||
SymbolID Sym = SymMgr.getConjuredSymbol(Ex, Count);
|
||||
|
||||
V = Ex->getType()->isPointerType()
|
||||
V = IsPointerType(Ex->getType())
|
||||
? cast<RVal>(lval::SymbolVal(Sym))
|
||||
: cast<RVal>(nonlval::SymbolVal(Sym));
|
||||
}
|
||||
|
@ -1833,7 +1837,7 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B,
|
|||
unsigned Count = Builder->getCurrentBlockCount();
|
||||
SymbolID Sym = SymMgr.getConjuredSymbol(B->getRHS(), Count);
|
||||
|
||||
RightV = B->getRHS()->getType()->isPointerType()
|
||||
RightV = IsPointerType(B->getRHS()->getType())
|
||||
? cast<RVal>(lval::SymbolVal(Sym))
|
||||
: cast<RVal>(nonlval::SymbolVal(Sym));
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче