summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-04-22 04:56:29 +0000
committerTed Kremenek <kremenek@apple.com>2008-04-22 04:56:29 +0000
commitda5cdda2487bd1fbdadf408fcac3051f1ffadb69 (patch)
tree9afff21cd40018796d3d5261bf33e182160dcb74
parentf0168bd208ca633c708126f61bb4939e292c1468 (diff)
downloadbcm5719-llvm-da5cdda2487bd1fbdadf408fcac3051f1ffadb69.tar.gz
bcm5719-llvm-da5cdda2487bd1fbdadf408fcac3051f1ffadb69.zip
Added null-dereference check for ArraySubscriptExpr.
llvm-svn: 50083
-rw-r--r--clang/lib/Analysis/GRExprEngine.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp
index 86d2cc9ae5f..677ef1cdc95 100644
--- a/clang/lib/Analysis/GRExprEngine.cpp
+++ b/clang/lib/Analysis/GRExprEngine.cpp
@@ -218,6 +218,10 @@ void GRExprEngine::Visit(Stmt* S, NodeTy* Pred, NodeSet& Dst) {
Dst.Add(Pred); // No-op. Simply propagate the current state unchanged.
break;
+
+ case Stmt::ArraySubscriptExprClass:
+ VisitArraySubscriptExpr(cast<ArraySubscriptExpr>(S), Pred, Dst, false);
+ break;
case Stmt::AsmStmtClass:
VisitAsmStmt(cast<AsmStmt>(S), Pred, Dst);
@@ -296,7 +300,7 @@ void GRExprEngine::Visit(Stmt* S, NodeTy* Pred, NodeSet& Dst) {
}
case Stmt::ParenExprClass:
- Visit(cast<ParenExpr>(S)->getSubExpr(), Pred, Dst);
+ Visit(cast<ParenExpr>(S)->getSubExpr()->IgnoreParens(), Pred, Dst);
break;
case Stmt::SizeOfAlignOfTypeExprClass:
@@ -714,6 +718,32 @@ void GRExprEngine::VisitDeclRefExpr(DeclRefExpr* D, NodeTy* Pred, NodeSet& Dst){
MakeNode(Dst, D, Pred, SetBlkExprRVal(St, D, Y));
}
+/// VisitArraySubscriptExpr - Transfer function for array accesses
+void GRExprEngine::VisitArraySubscriptExpr(ArraySubscriptExpr* A, NodeTy* Pred,
+ NodeSet& Dst, bool asLVal) {
+
+ Expr* Base = A->getBase()->IgnoreParens();
+
+ // Evaluate the base.
+ NodeSet Tmp1;
+ Visit(Base, Pred, Tmp1);
+
+ // Dereference the base.
+ NodeSet Tmp2;
+
+ for (NodeSet::iterator I=Tmp1.begin(), E=Tmp1.end(); I!=E; ++I) {
+ ValueState* St = GetState(*I);
+ VisitDeref(Base, GetRVal(St, Base), St, *I, Tmp2, true);
+ }
+
+ // Get the index.
+ Tmp1.clear();
+ Expr* Index = A->getIdx()->IgnoreParens();
+
+ for (NodeSet::iterator I=Tmp2.begin(), E=Tmp2.end(); I!=E; ++I)
+ Visit(Index, *I, Dst);
+}
+
/// VisitMemberExpr - Transfer function for member expressions.
void GRExprEngine::VisitMemberExpr(MemberExpr* M, NodeTy* Pred,
NodeSet& Dst, bool asLVal) {
@@ -1431,6 +1461,10 @@ void GRExprEngine::VisitLVal(Expr* Ex, NodeTy* Pred, NodeSet& Dst) {
default:
break;
+ case Stmt::ArraySubscriptExprClass:
+ VisitArraySubscriptExpr(cast<ArraySubscriptExpr>(Ex), Pred, Dst, true);
+ return;
+
case Stmt::DeclRefExprClass:
Dst.Add(Pred);
return;
OpenPOWER on IntegriCloud