From 5939402e2c72889843a05dc2f892de5da650e029 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Thu, 23 Jul 2009 01:05:31 +0000 Subject: [PATCH] Add 'previsit' Checker pass for ObjCMessageExprs. llvm-svn: 76831 --- .../clang/Analysis/PathSensitive/GRExprEngine.h | 3 +++ clang/lib/Analysis/GRExprEngine.cpp | 19 ++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Analysis/PathSensitive/GRExprEngine.h b/clang/include/clang/Analysis/PathSensitive/GRExprEngine.h index 534b595..49c329a 100644 --- a/clang/include/clang/Analysis/PathSensitive/GRExprEngine.h +++ b/clang/include/clang/Analysis/PathSensitive/GRExprEngine.h @@ -585,6 +585,9 @@ protected: ObjCMessageExpr::arg_iterator E, NodeTy* Pred, NodeSet& Dst); + void VisitObjCMessageExprDispatchCheckers(ObjCMessageExpr* ME, NodeTy* Pred, + NodeSet& Dst); + void VisitObjCMessageExprDispatchHelper(ObjCMessageExpr* ME, NodeTy* Pred, NodeSet& Dst); diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp index eb31f84..dd2bda1 100644 --- a/clang/lib/Analysis/GRExprEngine.cpp +++ b/clang/lib/Analysis/GRExprEngine.cpp @@ -1855,12 +1855,12 @@ void GRExprEngine::VisitObjCMessageExprArgHelper(ObjCMessageExpr* ME, Visit(Receiver, Pred, Tmp); for (NodeSet::iterator NI = Tmp.begin(), NE = Tmp.end(); NI != NE; ++NI) - VisitObjCMessageExprDispatchHelper(ME, *NI, Dst); + VisitObjCMessageExprDispatchCheckers(ME, *NI, Dst); return; } - VisitObjCMessageExprDispatchHelper(ME, Pred, Dst); + VisitObjCMessageExprDispatchCheckers(ME, Pred, Dst); return; } @@ -1873,6 +1873,19 @@ void GRExprEngine::VisitObjCMessageExprArgHelper(ObjCMessageExpr* ME, VisitObjCMessageExprArgHelper(ME, AI, AE, *NI, Dst); } +void GRExprEngine::VisitObjCMessageExprDispatchCheckers(ObjCMessageExpr* ME, + NodeTy* Pred, + NodeSet& Dst) { + NodeSet Src; + Src.Add(Pred); + NodeSet DstTmp; + // Perform the previsit of the ObjCMessageExpr, storing the results in DstTmp. + CheckerVisit(ME, Src, DstTmp, true); + + for (NodeSet::iterator NI = DstTmp.begin(), NE = DstTmp.end(); NI != NE; ++NI) + VisitObjCMessageExprDispatchHelper(ME, *NI, Dst); +} + void GRExprEngine::VisitObjCMessageExprDispatchHelper(ObjCMessageExpr* ME, NodeTy* Pred, NodeSet& Dst) { @@ -2043,7 +2056,7 @@ void GRExprEngine::VisitObjCMessageExprDispatchHelper(ObjCMessageExpr* ME, return; } } - + // Check if we raise an exception. For now treat these as sinks. Eventually // we will want to handle exceptions properly. -- 2.7.4