From 5d30c69813ad18b19337f60c6fadc22508b85d1a Mon Sep 17 00:00:00 2001 From: Zhongxing Xu Date: Mon, 15 Nov 2010 08:48:43 +0000 Subject: [PATCH] Add skeleton for handling other kinds of CFGElements. llvm-svn: 119135 --- clang/include/clang/Analysis/CFG.h | 17 +++++----- .../Checker/PathSensitive/GRCoreEngine.h | 4 +-- .../Checker/PathSensitive/GRExprEngine.h | 12 +++++-- .../clang/Checker/PathSensitive/GRSubEngine.h | 2 +- clang/lib/Checker/GRCoreEngine.cpp | 4 +-- clang/lib/Checker/GRExprEngine.cpp | 33 +++++++++++++++++-- 6 files changed, 53 insertions(+), 19 deletions(-) diff --git a/clang/include/clang/Analysis/CFG.h b/clang/include/clang/Analysis/CFG.h index 8fea3f2bb8a3..fb239e8207f7 100644 --- a/clang/include/clang/Analysis/CFG.h +++ b/clang/include/clang/Analysis/CFG.h @@ -49,7 +49,7 @@ public: Statement, StatementAsLValue, Initializer, - Dtor, + ImplicitDtor, // dtor kind AutomaticObjectDtor, BaseDtor, @@ -74,7 +74,7 @@ public: Kind getKind() const { return static_cast(Data1.getInt()); } Kind getDtorKind() const { - assert(getKind() == Dtor); + assert(getKind() == ImplicitDtor); return static_cast(Data2.getInt() + DTOR_BEGIN); } @@ -132,13 +132,13 @@ public: class CFGImplicitDtor : public CFGElement { protected: CFGImplicitDtor(unsigned K, void* P, void* S) - : CFGElement(P, Dtor, S, K - DTOR_BEGIN) {} + : CFGElement(P, ImplicitDtor, S, K - DTOR_BEGIN) {} public: CFGImplicitDtor() {} static bool classof(const CFGElement *E) { - return E->getKind() == Dtor; + return E->getKind() == ImplicitDtor; } }; @@ -161,7 +161,8 @@ public: } static bool classof(const CFGElement *E) { - return E->getKind() == Dtor && E->getDtorKind() == AutomaticObjectDtor; + return E->getKind() == ImplicitDtor && + E->getDtorKind() == AutomaticObjectDtor; } }; @@ -178,7 +179,7 @@ public: } static bool classof(const CFGElement *E) { - return E->getKind() == Dtor && E->getDtorKind() == BaseDtor; + return E->getKind() == ImplicitDtor && E->getDtorKind() == BaseDtor; } }; @@ -195,7 +196,7 @@ public: } static bool classof(const CFGElement *E) { - return E->getKind() == Dtor && E->getDtorKind() == MemberDtor; + return E->getKind() == ImplicitDtor && E->getDtorKind() == MemberDtor; } }; @@ -212,7 +213,7 @@ public: } static bool classof(const CFGElement *E) { - return E->getKind() == Dtor && E->getDtorKind() == TemporaryDtor; + return E->getKind() == ImplicitDtor && E->getDtorKind() == TemporaryDtor; } }; diff --git a/clang/include/clang/Checker/PathSensitive/GRCoreEngine.h b/clang/include/clang/Checker/PathSensitive/GRCoreEngine.h index a1062ac03eb3..411f29d80238 100644 --- a/clang/include/clang/Checker/PathSensitive/GRCoreEngine.h +++ b/clang/include/clang/Checker/PathSensitive/GRCoreEngine.h @@ -90,8 +90,8 @@ private: SubEngine.ProcessEndPath(Builder); } - void ProcessStmt(const CFGElement E, GRStmtNodeBuilder& Builder) { - SubEngine.ProcessStmt(E, Builder); + void ProcessElement(const CFGElement E, GRStmtNodeBuilder& Builder) { + SubEngine.ProcessElement(E, Builder); } bool ProcessBlockEntrance(const CFGBlock* Blk, const ExplodedNode *Pred, diff --git a/clang/include/clang/Checker/PathSensitive/GRExprEngine.h b/clang/include/clang/Checker/PathSensitive/GRExprEngine.h index d125befdbedb..ab6a74dc34a4 100644 --- a/clang/include/clang/Checker/PathSensitive/GRExprEngine.h +++ b/clang/include/clang/Checker/PathSensitive/GRExprEngine.h @@ -175,9 +175,15 @@ public: return static_cast(lookupChecker(CHECKER::getTag())); } - /// ProcessStmt - Called by GRCoreEngine. Used to generate new successor - /// nodes by processing the 'effects' of a block-level statement. - void ProcessStmt(const CFGElement E, GRStmtNodeBuilder& builder); + /// ProcessElement - Called by GRCoreEngine. Used to generate new successor + /// nodes by processing the 'effects' of a CFG element. + void ProcessElement(const CFGElement E, GRStmtNodeBuilder& builder); + + void ProcessStmt(const CFGStmt S, GRStmtNodeBuilder &builder); + + void ProcessInitializer(const CFGInitializer I, GRStmtNodeBuilder &builder); + + void ProcessImplicitDtor(const CFGImplicitDtor D, GRStmtNodeBuilder &builder); /// ProcessBlockEntrance - Called by GRCoreEngine when start processing /// a CFGBlock. This method returns true if the analysis should continue diff --git a/clang/include/clang/Checker/PathSensitive/GRSubEngine.h b/clang/include/clang/Checker/PathSensitive/GRSubEngine.h index 1904835fbc34..ff86adc9f829 100644 --- a/clang/include/clang/Checker/PathSensitive/GRSubEngine.h +++ b/clang/include/clang/Checker/PathSensitive/GRSubEngine.h @@ -47,7 +47,7 @@ public: /// Called by GRCoreEngine. Used to generate new successor /// nodes by processing the 'effects' of a block-level statement. - virtual void ProcessStmt(const CFGElement E, GRStmtNodeBuilder& builder) = 0; + virtual void ProcessElement(const CFGElement E, GRStmtNodeBuilder& builder)=0; /// Called by GRCoreEngine when start processing /// a CFGBlock. This method returns true if the analysis should continue diff --git a/clang/lib/Checker/GRCoreEngine.cpp b/clang/lib/Checker/GRCoreEngine.cpp index 50aa563c6998..01d254c8f476 100644 --- a/clang/lib/Checker/GRCoreEngine.cpp +++ b/clang/lib/Checker/GRCoreEngine.cpp @@ -309,7 +309,7 @@ void GRCoreEngine::HandleBlockEntrance(const BlockEntrance& L, if (CFGElement E = L.getFirstElement()) { GRStmtNodeBuilder Builder(L.getBlock(), 0, Pred, this, SubEngine.getStateManager()); - ProcessStmt(E, Builder); + ProcessElement(E, Builder); } else HandleBlockExit(L.getBlock(), Pred); @@ -423,7 +423,7 @@ void GRCoreEngine::HandlePostStmt(const PostStmt& L, const CFGBlock* B, else { GRStmtNodeBuilder Builder(B, StmtIdx, Pred, this, SubEngine.getStateManager()); - ProcessStmt((*B)[StmtIdx], Builder); + ProcessElement((*B)[StmtIdx], Builder); } } diff --git a/clang/lib/Checker/GRExprEngine.cpp b/clang/lib/Checker/GRExprEngine.cpp index 4a1df68e5be9..d57bbc2dc119 100644 --- a/clang/lib/Checker/GRExprEngine.cpp +++ b/clang/lib/Checker/GRExprEngine.cpp @@ -552,8 +552,27 @@ void GRExprEngine::ProcessEndWorklist(bool hasWorkRemaining) { } } -void GRExprEngine::ProcessStmt(const CFGElement CE,GRStmtNodeBuilder& builder) { - CurrentStmt = CE.getAs(); +void GRExprEngine::ProcessElement(const CFGElement E, + GRStmtNodeBuilder& builder) { + switch (E.getKind()) { + case CFGElement::Statement: + case CFGElement::StatementAsLValue: + ProcessStmt(E.getAs(), builder); + break; + case CFGElement::Initializer: + ProcessInitializer(E.getAs(), builder); + break; + case CFGElement::ImplicitDtor: + ProcessImplicitDtor(E.getAs(), builder); + break; + default: + // Suppress compiler warning. + llvm_unreachable("Unexpected CFGElement kind."); + } +} + +void GRExprEngine::ProcessStmt(const CFGStmt S, GRStmtNodeBuilder& builder) { + CurrentStmt = S.getStmt(); PrettyStackTraceLoc CrashInfo(getContext().getSourceManager(), CurrentStmt->getLocStart(), "Error evaluating statement"); @@ -636,7 +655,7 @@ void GRExprEngine::ProcessStmt(const CFGElement CE,GRStmtNodeBuilder& builder) { Builder->SetCleanedState(*I == EntryNode ? CleanedState : GetState(*I)); // Visit the statement. - if (CE.getAs().asLValue()) + if (S.asLValue()) VisitLValue(cast(CurrentStmt), *I, Dst); else Visit(CurrentStmt, *I, Dst); @@ -660,6 +679,14 @@ void GRExprEngine::ProcessStmt(const CFGElement CE,GRStmtNodeBuilder& builder) { Builder = NULL; } +void GRExprEngine::ProcessInitializer(const CFGInitializer I, + GRStmtNodeBuilder &builder) { +} + +void GRExprEngine::ProcessImplicitDtor(const CFGImplicitDtor D, + GRStmtNodeBuilder &builder) { +} + void GRExprEngine::Visit(const Stmt* S, ExplodedNode* Pred, ExplodedNodeSet& Dst) { PrettyStackTraceLoc CrashInfo(getContext().getSourceManager(),