diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h | 14 | ||||
-rw-r--r-- | clang/lib/Analysis/GRCoreEngine.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Analysis/GRExprEngine.cpp | 37 |
3 files changed, 33 insertions, 22 deletions
diff --git a/clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h b/clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h index 61f73093fc1..d4074af5a9a 100644 --- a/clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h +++ b/clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h @@ -126,8 +126,6 @@ class GRStmtNodeBuilderImpl { const unsigned Idx; ExplodedNodeImpl* Pred; ExplodedNodeImpl* LastNode; - bool HasGeneratedNode; - bool Populated; typedef llvm::SmallPtrSet<ExplodedNodeImpl*,5> DeferredTy; DeferredTy Deferred; @@ -164,8 +162,6 @@ public: Stmt* getStmt() const { return B[Idx]; } CFGBlock* getBlock() const { return &B; } - - bool hasGeneratedNode() const { return HasGeneratedNode; } }; @@ -183,13 +179,12 @@ class GRStmtNodeBuilder { public: GRStmtNodeBuilder(GRStmtNodeBuilderImpl& nb) : NB(nb), CallExprAuditBeg(0), CallExprAuditEnd(0), - ObjCMsgExprAuditBeg(0), ObjCMsgExprAuditEnd(0), BuildSinks(false) { + ObjCMsgExprAuditBeg(0), ObjCMsgExprAuditEnd(0), + BuildSinks(false), HasGeneratedNode(false) { CleanedState = getLastNode()->getState(); } - bool hasGeneratedNode() const { return NB.hasGeneratedNode(); } - void setObjCMsgExprAuditors(GRAuditor<StateTy> **B, GRAuditor<StateTy> **E) { ObjCMsgExprAuditBeg = B; @@ -207,10 +202,12 @@ public: } NodeTy* generateNode(Stmt* S, StateTy* St, NodeTy* Pred) { + HasGeneratedNode = true; return static_cast<NodeTy*>(NB.generateNodeImpl(S, St, Pred)); } NodeTy* generateNode(Stmt* S, StateTy* St) { + HasGeneratedNode = true; return static_cast<NodeTy*>(NB.generateNodeImpl(S, St)); } @@ -275,7 +272,8 @@ public: return N; } - bool BuildSinks; + bool BuildSinks; + bool HasGeneratedNode; }; class GRBranchNodeBuilderImpl { diff --git a/clang/lib/Analysis/GRCoreEngine.cpp b/clang/lib/Analysis/GRCoreEngine.cpp index 7ad7f73abf7..c2b8c115fdb 100644 --- a/clang/lib/Analysis/GRCoreEngine.cpp +++ b/clang/lib/Analysis/GRCoreEngine.cpp @@ -286,7 +286,7 @@ void GRCoreEngineImpl::GenerateNode(const ProgramPoint& Loc, void* State, GRStmtNodeBuilderImpl::GRStmtNodeBuilderImpl(CFGBlock* b, unsigned idx, ExplodedNodeImpl* N, GRCoreEngineImpl* e) - : Eng(*e), B(*b), Idx(idx), Pred(N), LastNode(N), Populated(false) { + : Eng(*e), B(*b), Idx(idx), Pred(N), LastNode(N) { Deferred.insert(N); } @@ -324,8 +324,6 @@ ExplodedNodeImpl* GRStmtNodeBuilderImpl::generateNodeImpl(Stmt* S, void* State, N->addPredecessor(Pred); Deferred.erase(Pred); - HasGeneratedNode = true; - if (IsNew) { Deferred.insert(N); LastNode = N; diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp index 2e474fc8e9a..8c771bffa14 100644 --- a/clang/lib/Analysis/GRExprEngine.cpp +++ b/clang/lib/Analysis/GRExprEngine.cpp @@ -188,7 +188,7 @@ void GRExprEngine::ProcessStmt(Stmt* S, StmtNodeBuilder& builder) { // dead mappings removed. if (Dst.size() == 1 && *Dst.begin() == StmtEntryNode && - !Builder->hasGeneratedNode()) + !Builder->HasGeneratedNode) builder.generateNode(S, GetState(StmtEntryNode), StmtEntryNode); // NULL out these variables to cleanup. @@ -715,7 +715,11 @@ void GRExprEngine::EvalStore(NodeSet& Dst, Expr* E, NodeTy* Pred, assert (Builder && "GRStmtNodeBuilder must be defined."); unsigned size = Dst.size(); - SaveAndRestore<bool> OldSink(Builder->BuildSinks); + + SaveAndRestore<bool> OldSink(Builder->BuildSinks), + OldHasGen(Builder->HasGeneratedNode); + + Builder->HasGeneratedNode = false; assert (!TargetLV.isUndef()); @@ -724,7 +728,7 @@ void GRExprEngine::EvalStore(NodeSet& Dst, Expr* E, NodeTy* Pred, // Handle the case where no nodes where generated. Auto-generate that // contains the updated state if we aren't generating sinks. - if (!Builder->BuildSinks && Dst.size() == size) + if (!Builder->BuildSinks && Dst.size() == size && !Builder->HasGeneratedNode) TF->GRTransferFuncs::EvalStore(Dst, *this, *Builder, E, Pred, St, TargetLV, Val); } @@ -888,14 +892,18 @@ void GRExprEngine::VisitCall(CallExpr* CE, NodeTy* Pred, unsigned size = Dst.size(); - SaveAndRestore<bool> OldSink(Builder->BuildSinks); + SaveAndRestore<bool> OldSink(Builder->BuildSinks), + OldHasGen(Builder->HasGeneratedNode); + Builder->HasGeneratedNode = false; + EvalCall(Dst, CE, cast<LVal>(L), *DI); // Handle the case where no nodes where generated. Auto-generate that // contains the updated state if we aren't generating sinks. - if (!Builder->BuildSinks && Dst.size() == size) + if (!Builder->BuildSinks && Dst.size() == size && + !Builder->HasGeneratedNode) MakeNode(Dst, CE, *DI, St); } } @@ -991,14 +999,18 @@ void GRExprEngine::VisitObjCMessageExprDispatchHelper(ObjCMessageExpr* ME, // Dispatch to plug-in transfer function. unsigned size = Dst.size(); - SaveAndRestore<bool> OldSink(Builder->BuildSinks); + + SaveAndRestore<bool> OldSink(Builder->BuildSinks), + OldHasGen(Builder->HasGeneratedNode); + Builder->HasGeneratedNode = false; + EvalObjCMessageExpr(Dst, ME, Pred); // Handle the case where no nodes where generated. Auto-generate that // contains the updated state if we aren't generating sinks. - if (!Builder->BuildSinks && Dst.size() == size) + if (!Builder->BuildSinks && Dst.size() == size && !Builder->HasGeneratedNode) MakeNode(Dst, ME, Pred, St); } @@ -1461,14 +1473,17 @@ void GRExprEngine::EvalReturn(NodeSet& Dst, ReturnStmt* S, NodeTy* Pred) { assert (Builder && "GRStmtNodeBuilder must be defined."); unsigned size = Dst.size(); - SaveAndRestore<bool> OldSink(Builder->BuildSinks); + + SaveAndRestore<bool> OldSink(Builder->BuildSinks), + OldHasGen(Builder->HasGeneratedNode); + Builder->HasGeneratedNode = false; + TF->EvalReturn(Dst, *this, *Builder, S, Pred); - // Handle the case where no nodes where generated. Auto-generate that - // contains the updated state if we aren't generating sinks. + // Handle the case where no nodes where generated. - if (!Builder->BuildSinks && Dst.size() == size) + if (!Builder->BuildSinks && Dst.size() == size && !Builder->HasGeneratedNode) MakeNode(Dst, S, Pred, GetState(Pred)); } |