From: Ted Kremenek Date: Thu, 23 Jul 2009 01:05:31 +0000 (+0000) Subject: Add 'previsit' Checker pass for ObjCMessageExprs. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7a2d953224e51b2b7d7cbf9194a1dbc1ca0be4a0;p=clang Add 'previsit' Checker pass for ObjCMessageExprs. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@76831 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Analysis/PathSensitive/GRExprEngine.h b/include/clang/Analysis/PathSensitive/GRExprEngine.h index 534b595c0d..49c329a75c 100644 --- a/include/clang/Analysis/PathSensitive/GRExprEngine.h +++ b/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/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index eb31f84b0c..dd2bda1331 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/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.