]> granicus.if.org Git - clang/commitdiff
Add skeleton for handling other kinds of CFGElements.
authorZhongxing Xu <xuzhongxing@gmail.com>
Mon, 15 Nov 2010 08:48:43 +0000 (08:48 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Mon, 15 Nov 2010 08:48:43 +0000 (08:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119135 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/CFG.h
include/clang/Checker/PathSensitive/GRCoreEngine.h
include/clang/Checker/PathSensitive/GRExprEngine.h
include/clang/Checker/PathSensitive/GRSubEngine.h
lib/Checker/GRCoreEngine.cpp
lib/Checker/GRExprEngine.cpp

index 8fea3f2bb8a30906581656d572d827cca74303c5..fb239e8207f7509f2dfda628b7b730a7849c5c25 100644 (file)
@@ -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<Kind>(Data1.getInt()); }
 
   Kind getDtorKind() const {
-    assert(getKind() == Dtor);
+    assert(getKind() == ImplicitDtor);
     return static_cast<Kind>(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;
   }
 };
 
index a1062ac03eb38b3176e775bf1047c7b7ffdbb254..411f29d80238ad17bd43e3fba4ae2407c22f1a47 100644 (file)
@@ -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,
index d125befdbedb475d04806d5352dfe770d647b09f..ab6a74dc34a40f5f6857f96f43ff5fb8e6fc4936 100644 (file)
@@ -175,9 +175,15 @@ public:
      return static_cast<CHECKER*>(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
index 1904835fbc34c09b27003f34f7b90235dfb1a68f..ff86adc9f82967cf1d011177c5f140e929f23cb8 100644 (file)
@@ -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
index 50aa563c699843f438b1a4a97fb627d53a977294..01d254c8f476476a9ec3796c83bc32dff23f1b5d 100644 (file)
@@ -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);
   }
 }
 
index 4a1df68e5be9af80d15633a841a8e55a8d00f400..d57bbc2dc119e7c4499182e6fde8159db21c688f 100644 (file)
@@ -552,8 +552,27 @@ void GRExprEngine::ProcessEndWorklist(bool hasWorkRemaining) {
   }
 }
 
-void GRExprEngine::ProcessStmt(const CFGElement CE,GRStmtNodeBuilder& builder) {
-  CurrentStmt = CE.getAs<CFGStmt>();
+void GRExprEngine::ProcessElement(const CFGElement E, 
+                                  GRStmtNodeBuilder& builder) {
+  switch (E.getKind()) {
+  case CFGElement::Statement:
+  case CFGElement::StatementAsLValue:
+    ProcessStmt(E.getAs<CFGStmt>(), builder);
+    break;
+  case CFGElement::Initializer:
+    ProcessInitializer(E.getAs<CFGInitializer>(), builder);
+    break;
+  case CFGElement::ImplicitDtor:
+    ProcessImplicitDtor(E.getAs<CFGImplicitDtor>(), 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<CFGStmt>().asLValue())
+    if (S.asLValue())
       VisitLValue(cast<Expr>(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(),