From: Ted Kremenek Date: Tue, 29 Jan 2008 23:32:35 +0000 (+0000) Subject: Implemented more boilerplate in GREngine for processing branches. Now X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=71c29bdc931bc49644c581ec7d698f0dbf01a0aa;p=clang Implemented more boilerplate in GREngine for processing branches. Now we automatically generate a new successor node along an edge if the checker did not explicitly do so (i.e., we just propagate the current state). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46536 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Analysis/GRConstants.cpp b/Analysis/GRConstants.cpp index 2c6c7f7844..ad00b608c8 100644 --- a/Analysis/GRConstants.cpp +++ b/Analysis/GRConstants.cpp @@ -831,8 +831,7 @@ public: /// ProcessBranch - Called by GREngine. Used to generate successor /// nodes by processing the 'effects' of a branch condition. - void ProcessBranch(Stmt* Condition, Stmt* Term, BranchNodeBuilder& builder) - {} + void ProcessBranch(Stmt* Condition, Stmt* Term, BranchNodeBuilder& builder); /// RemoveDeadBindings - Return a new state that is the same as 'M' except /// that all subexpression mappings are removed and that any @@ -877,6 +876,12 @@ public: } // end anonymous namespace +void GRConstants::ProcessBranch(Stmt* Condition, Stmt* Term, + BranchNodeBuilder& builder) { + + +} + void GRConstants::ProcessStmt(Stmt* S, StmtNodeBuilder& builder) { Builder = &builder; diff --git a/Analysis/GREngine.cpp b/Analysis/GREngine.cpp index 35101a9dea..43ee864302 100644 --- a/Analysis/GREngine.cpp +++ b/Analysis/GREngine.cpp @@ -296,6 +296,14 @@ void GRBranchNodeBuilderImpl::generateNodeImpl(void* State, bool branch) { Succ->addPredecessor(Pred); + if (branch) GeneratedTrue = true; + else GeneratedFalse = true; + if (IsNew) Eng.WList->Enqueue(GRWorkListUnit(Succ)); } + +GRBranchNodeBuilderImpl::~GRBranchNodeBuilderImpl() { + if (!GeneratedTrue) generateNodeImpl(Pred->State, true); + if (!GeneratedFalse) generateNodeImpl(Pred->State, false); +} diff --git a/include/clang/Analysis/PathSensitive/GREngine.h b/include/clang/Analysis/PathSensitive/GREngine.h index c3a9e209b8..175b1fb7ae 100644 --- a/include/clang/Analysis/PathSensitive/GREngine.h +++ b/include/clang/Analysis/PathSensitive/GREngine.h @@ -167,12 +167,16 @@ class GRBranchNodeBuilderImpl { CFGBlock* DstF; ExplodedNodeImpl* Pred; + bool GeneratedTrue; + bool GeneratedFalse; + public: GRBranchNodeBuilderImpl(CFGBlock* src, CFGBlock* dstT, CFGBlock* dstF, ExplodedNodeImpl* pred, GREngineImpl* e) - : Eng(*e), Src(src), DstT(dstT), DstF(dstF), Pred(pred) {} + : Eng(*e), Src(src), DstT(dstT), DstF(dstF), Pred(pred), + GeneratedTrue(false), GeneratedFalse(false) {} - ~GRBranchNodeBuilderImpl() {} + ~GRBranchNodeBuilderImpl(); const ExplodedGraphImpl& getGraph() const { return *Eng.G; }