]> granicus.if.org Git - clang/commitdiff
Create PathDiagnosticPiece subclasses PathDiagnosticEventPiece and
authorTed Kremenek <kremenek@apple.com>
Fri, 6 Mar 2009 23:58:11 +0000 (23:58 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 6 Mar 2009 23:58:11 +0000 (23:58 +0000)
PathDiagnosticControlFlowPiece to distinguish (in the class hierarchy) between
events and control-flow diagnostic pieces. Clients must now use these directly
when constructing PathDiagnosticPieces.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66310 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/PathDiagnostic.h
lib/Analysis/BugReporter.cpp
lib/Analysis/CFRefCount.cpp
lib/Analysis/PathDiagnostic.cpp

index 61c6a4094c4d60546205c77abd30549043697977..d5fa0a2192458b3f9f360cec0be51727c4d3fdd2 100644 (file)
@@ -190,14 +190,15 @@ private:
   PathDiagnosticPiece();
   PathDiagnosticPiece(const PathDiagnosticPiece &P);
   PathDiagnosticPiece& operator=(const PathDiagnosticPiece &P);
-  
-public:
+
+protected:
   PathDiagnosticPiece(FullSourceLoc pos, const std::string& s,
                       Kind k = Event, DisplayHint hint = Below);
   
   PathDiagnosticPiece(FullSourceLoc pos, const char* s,
                       Kind k = Event, DisplayHint hint = Below);
   
+public:
   virtual ~PathDiagnosticPiece();
   
   const std::string& getString() const { return str; }
@@ -244,6 +245,40 @@ public:
   }
     
   FullSourceLoc getLocation() const { return Pos; }
+  
+  static inline bool classof(const PathDiagnosticPiece* P) {
+    return true;
+  }
+};
+  
+class PathDiagnosticEventPiece : public PathDiagnosticPiece {
+public:
+  PathDiagnosticEventPiece(FullSourceLoc pos, const std::string& s)
+  : PathDiagnosticPiece(pos, s, Event) {}
+  
+  PathDiagnosticEventPiece(FullSourceLoc pos, const char* s)
+  : PathDiagnosticPiece(pos, s, Event) {}
+  
+  ~PathDiagnosticEventPiece();
+
+  static inline bool classof(const PathDiagnosticPiece* P) {
+    return P->getKind() == Event;
+  }
+};
+  
+class PathDiagnosticControlFlowPiece : public PathDiagnosticPiece {
+public:
+  PathDiagnosticControlFlowPiece(FullSourceLoc pos, const std::string& s)
+    : PathDiagnosticPiece(pos, s, Event) {}
+  
+  PathDiagnosticControlFlowPiece(FullSourceLoc pos, const char* s)
+    : PathDiagnosticPiece(pos, s, Event) {}
+  
+  ~PathDiagnosticControlFlowPiece();
+  
+  static inline bool classof(const PathDiagnosticPiece* P) {
+    return P->getKind() == ControlFlow;
+  }
 };
   
 class PathDiagnosticMacroPiece : public PathDiagnosticPiece {
@@ -262,6 +297,10 @@ public:
   typedef std::vector<PathDiagnosticPiece*>::iterator iterator;
   iterator begin() { return SubPieces.begin(); }
   iterator end() { return SubPieces.end(); }
+  
+  static inline bool classof(const PathDiagnosticPiece* P) {
+    return P->getKind() == Macro;
+  }
 };
 
 } //end clang namespace
index 88887b1d6c75ea538f0335cdf29e6d73d78ea8b4..12e50d34601618e26a9b669bb4d958cbf0fd0c37 100644 (file)
@@ -135,7 +135,7 @@ BugReport::getEndPath(BugReporter& BR,
     return NULL;
   
   FullSourceLoc L(S->getLocStart(), BR.getContext().getSourceManager());
-  PathDiagnosticPiece* P = new PathDiagnosticPiece(L, getDescription());
+  PathDiagnosticPiece* P = new PathDiagnosticEventPiece(L, getDescription());
   
   const SourceRange *Beg, *End;
   getRanges(BR, Beg, End);  
@@ -481,7 +481,7 @@ public:
       std::string msg = "'" + std::string(VD->getNameAsString()) +
       "' now aliases '" + MostRecent->getNameAsString() + "'";
       
-      PD.push_front(new PathDiagnosticPiece(L, msg));
+      PD.push_front(new PathDiagnosticEventPiece(L, msg));
     }
     
     return true;
@@ -643,8 +643,7 @@ void GRBugReporter::GeneratePathDiagnostic(PathDiagnostic& PD,
           os << "Control jumps to line "
              << SMgr.getInstantiationLineNumber(S->getLocStart()) << ".\n";
           
-          PD.push_front(new PathDiagnosticPiece(L, os.str(), 
-                                             PathDiagnosticPiece::ControlFlow));
+          PD.push_front(new PathDiagnosticControlFlowPiece(L, os.str()));
           break;
         }
           
@@ -712,8 +711,7 @@ void GRBugReporter::GeneratePathDiagnostic(PathDiagnostic& PD,
             ExecutionContinues(os, SMgr, N, getStateManager().getCodeDecl());
           }
           
-          PD.push_front(new PathDiagnosticPiece(L, os.str(),
-                                             PathDiagnosticPiece::ControlFlow));
+          PD.push_front(new PathDiagnosticControlFlowPiece(L, os.str()));
           break;
         }
           
@@ -722,8 +720,7 @@ void GRBugReporter::GeneratePathDiagnostic(PathDiagnostic& PD,
           std::string sbuf;
           llvm::raw_string_ostream os(sbuf);
           ExecutionContinues(os, SMgr, N, getStateManager().getCodeDecl());
-          PD.push_front(new PathDiagnosticPiece(L, os.str(),
-                                            PathDiagnosticPiece::ControlFlow));
+          PD.push_front(new PathDiagnosticControlFlowPiece(L, os.str()));
           break;
         }
 
@@ -737,8 +734,7 @@ void GRBugReporter::GeneratePathDiagnostic(PathDiagnostic& PD,
           else
             os << "true.";
           
-          PD.push_front(new PathDiagnosticPiece(L, os.str(),
-                                            PathDiagnosticPiece::ControlFlow));          
+          PD.push_front(new PathDiagnosticControlFlowPiece(L, os.str()));
           break;
         }
           
@@ -751,13 +747,11 @@ void GRBugReporter::GeneratePathDiagnostic(PathDiagnostic& PD,
             os << "Loop condition is true. ";
             ExecutionContinues(os, SMgr, N, getStateManager().getCodeDecl());
             
-            PD.push_front(new PathDiagnosticPiece(L, os.str(),
-                                             PathDiagnosticPiece::ControlFlow));
+            PD.push_front(new PathDiagnosticControlFlowPiece(L, os.str()));
           }
           else
-            PD.push_front(new PathDiagnosticPiece(L,
-                              "Loop condition is false.  Exiting loop.",
-                              PathDiagnosticPiece::ControlFlow));
+            PD.push_front(new PathDiagnosticControlFlowPiece(L,
+                                    "Loop condition is false.  Exiting loop."));
           
           break;
         }
@@ -772,24 +766,22 @@ void GRBugReporter::GeneratePathDiagnostic(PathDiagnostic& PD,
             os << "Loop condition is false. ";
             ExecutionContinues(os, SMgr, N, getStateManager().getCodeDecl());
 
-            PD.push_front(new PathDiagnosticPiece(L, os.str(),
-                                             PathDiagnosticPiece::ControlFlow));
+            PD.push_front(new PathDiagnosticControlFlowPiece(L, os.str()));
           }
           else
-            PD.push_front(new PathDiagnosticPiece(L,
-                            "Loop condition is true.  Entering loop body.",
-                            PathDiagnosticPiece::ControlFlow));
+            PD.push_front(new PathDiagnosticControlFlowPiece(L,
+                                                             "Loop condition is true.  Entering loop body."));
           
           break;
         }
           
         case Stmt::IfStmtClass: {          
           if (*(Src->succ_begin()+1) == Dst)
-            PD.push_front(new PathDiagnosticPiece(L, "Taking false branch.",
-                            PathDiagnosticPiece::ControlFlow));
+            PD.push_front(new PathDiagnosticControlFlowPiece(L,
+                                                       "Taking false branch."));
           else  
-            PD.push_front(new PathDiagnosticPiece(L, "Taking true branch.",
-                            PathDiagnosticPiece::ControlFlow));
+            PD.push_front(new PathDiagnosticControlFlowPiece(L,
+                                                       "Taking true branch."));
           
           break;
         }
@@ -872,7 +864,9 @@ void BugReporter::FlushReport(BugReportEquivClass& EQ) {
     return;
   
   if (D->empty()) { 
-    PathDiagnosticPiece* piece = new PathDiagnosticPiece(L, R.getDescription());
+    PathDiagnosticPiece* piece =
+      new PathDiagnosticEventPiece(L, R.getDescription());
+
     for ( ; Beg != End; ++Beg) piece->addRange(*Beg);
     D->push_back(piece);
   }
index 6caea59f3e40cad731acea77c283e29db50cc1fa..b08bce1d58a3d7c0df803174094e6e7e4e6dccdd 100644 (file)
@@ -2506,7 +2506,7 @@ PathDiagnosticPiece* CFRefReport::VisitNode(const ExplodedNode<GRState>* N,
     }
     
     FullSourceLoc Pos(S->getLocStart(), BR.getContext().getSourceManager());
-    PathDiagnosticPiece* P = new PathDiagnosticPiece(Pos, os.str());
+    PathDiagnosticPiece* P = new PathDiagnosticEventPiece(Pos, os.str());
     
     if (Expr* Exp = dyn_cast<Expr>(S))
       P->addRange(Exp->getSourceRange());
@@ -2655,7 +2655,7 @@ PathDiagnosticPiece* CFRefReport::VisitNode(const ExplodedNode<GRState>* N,
   
   Stmt* S = cast<PostStmt>(N->getLocation()).getStmt();    
   FullSourceLoc Pos(S->getLocStart(), BR.getContext().getSourceManager());
-  PathDiagnosticPiece* P = new PathDiagnosticPiece(Pos, os.str());
+  PathDiagnosticPiece* P = new PathDiagnosticEventPiece(Pos, os.str());
   
   // Add the range by scanning the children of the statement for any bindings
   // to Sym.
@@ -2844,7 +2844,7 @@ CFRefLeakReport::getEndPath(BugReporter& br, const ExplodedNode<GRState>* EndN){
           " +"
        << RV->getCount() << " (object leaked).";
   
-  return new PathDiagnosticPiece(L, os.str());
+  return new PathDiagnosticEventPiece(L, os.str());
 }
 
 
index 49af34dc1c1e909b70f8851436b42bc4b37961b4..ae53ed9dbf07c9bdeb57e7ade7d8d177ea69f47b 100644 (file)
@@ -50,6 +50,8 @@ PathDiagnosticPiece::PathDiagnosticPiece(FullSourceLoc pos,
 }
 
 PathDiagnosticPiece::~PathDiagnosticPiece() {}
+PathDiagnosticEventPiece::~PathDiagnosticEventPiece() {}
+PathDiagnosticControlFlowPiece::~PathDiagnosticControlFlowPiece() {}
 
 PathDiagnosticMacroPiece::~PathDiagnosticMacroPiece() {
   for (iterator I = begin(), E = end(); I != E; ++I) delete *I;
@@ -99,7 +101,7 @@ void PathDiagnosticClient::HandleDiagnostic(Diagnostic::Level DiagLevel,
   Info.FormatDiagnostic(StrC);
   
   PathDiagnosticPiece *P =
-    new PathDiagnosticPiece(Info.getLocation(),
+    new PathDiagnosticEventPiece(Info.getLocation(),
                             std::string(StrC.begin(), StrC.end()));
   
   for (unsigned i = 0, e = Info.getNumRanges(); i != e; ++i)