]> granicus.if.org Git - clang/commitdiff
Add "category" to BugTypes, allowing bugs to be grouped.
authorTed Kremenek <kremenek@apple.com>
Sat, 20 Sep 2008 04:23:38 +0000 (04:23 +0000)
committerTed Kremenek <kremenek@apple.com>
Sat, 20 Sep 2008 04:23:38 +0000 (04:23 +0000)
Changed casing of many bug names.  The convention will be to have bug names (mostly) lower cased, and categories use some capitalization.

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

include/clang/Analysis/PathDiagnostic.h
include/clang/Analysis/PathSensitive/BugReporter.h
lib/Analysis/BugReporter.cpp
lib/Analysis/CFRefCount.cpp
lib/Analysis/CheckDeadStores.cpp
lib/Analysis/GRExprEngineInternalChecks.cpp
lib/Driver/HTMLDiagnostics.cpp

index bb31ee391f01c1d573ddf58776a7839903fb7b0e..e266ee8518ff0112f18c72b92c53d6cd079370d8 100644 (file)
@@ -77,18 +77,22 @@ class PathDiagnostic {
   std::list<PathDiagnosticPiece*> path;
   unsigned Size;
   std::string Desc;
+  std::string Category;
   std::vector<std::string> OtherDesc;
 
 public:  
   PathDiagnostic() : Size(0) {}
 
-  PathDiagnostic(const char* desc) : Size(0), Desc(desc) {}
+  PathDiagnostic(const char* desc, const char* category)
+    : Size(0), Desc(desc), Category(category) {}
   
-  PathDiagnostic(const std::string& desc) : Size(0), Desc(desc) {}
+  PathDiagnostic(const std::string& desc, const std::string& category)
+    : Size(0), Desc(desc), Category(category) {}
   
   ~PathDiagnostic();
 
   const std::string& getDescription() const { return Desc; }
+  const std::string& getCategory() const { return Category; }
   
   typedef std::vector<std::string>::const_iterator meta_iterator;
   meta_iterator meta_begin() const { return OtherDesc.begin(); }
index 39e67f779875b0ed886ee58f2ce29274e4cb4355..7f2511f435dfc284e9412dbe6307d1933504ad73 100644 (file)
@@ -45,6 +45,7 @@ public:
   
   virtual const char* getName() const = 0;
   virtual const char* getDescription() const { return getName(); }
+  virtual const char* getCategory() const { return ""; }
   
   virtual std::pair<const char**,const char**> getExtraDescriptiveText() {
     return std::pair<const char**, const char**>(0, 0);
@@ -87,6 +88,10 @@ public:
     return getBugType().getDescription();
   }
   
+  virtual const char* getCategory() const {
+    return getBugType().getCategory();
+  }
+  
   virtual std::pair<const char**,const char**> getExtraDescriptiveText() {
     return getBugType().getExtraDescriptiveText();
   }
@@ -200,6 +205,11 @@ public:
                        SourceLocation Loc,
                        SourceRange* RangeBeg, unsigned NumRanges);
 
+  void EmitBasicReport(const char* BugName, const char* BugCategory,
+                       const char* BugStr, SourceLocation Loc,
+                       SourceRange* RangeBeg, unsigned NumRanges);
+  
+  
   void EmitBasicReport(const char* BugName, const char* BugStr,
                        SourceLocation Loc) {
     EmitBasicReport(BugName, BugStr, Loc, 0, 0);
@@ -210,6 +220,11 @@ public:
     EmitBasicReport(BugName, BugStr, Loc, &R, 1);
   }
   
+  void EmitBasicReport(const char* BugName, const char* Category,
+                       const char* BugStr, SourceLocation Loc, SourceRange R) {
+    EmitBasicReport(BugName, Category, BugStr, Loc, &R, 1);
+  }
+  
   static bool classof(const BugReporter* R) { return true; }
 };
   
@@ -315,13 +330,16 @@ public:
   
 class SimpleBugType : public BugTypeCacheLocation {
   const char* name;
+  const char* category;
   const char* desc;
 public:
-  SimpleBugType(const char* n) : name(n), desc(n) {}
-  SimpleBugType(const char* n, const char* d) : name(n), desc(d) {}
+  SimpleBugType(const char* n) : name(n), category(""), desc(0) {}
+  SimpleBugType(const char* n, const char* c, const char* d)
+    : name(n), category(c), desc(d) {}
   
   virtual const char* getName() const { return name; }
-  virtual const char* getDescription() const { return desc; }
+  virtual const char* getDescription() const { return desc ? desc : name; }
+  virtual const char* getCategory() const { return category; }
 };
   
 } // end clang namespace
index b163eea1b82d2c019284a98ec2d1c14cf8dc021a..6a1478a9cbbc5b41a5b7174f095f41fcd472a8b0 100644 (file)
@@ -701,7 +701,8 @@ void BugReporter::EmitWarning(BugReport& R) {
   if (R.getBugType().isCached(R))
     return;
 
-  llvm::OwningPtr<PathDiagnostic> D(new PathDiagnostic(R.getName()));
+  llvm::OwningPtr<PathDiagnostic> D(new PathDiagnostic(R.getName(),
+                                                       R.getCategory()));
   GeneratePathDiagnostic(*D.get(), R);
   
   // Get the meta data.
@@ -764,12 +765,17 @@ void BugReporter::EmitWarning(BugReport& R) {
   }
 }
 
-void
-BugReporter::EmitBasicReport(const char* name, const char* str,
-                             SourceLocation Loc,
-                             SourceRange* RBeg, unsigned NumRanges) {
+void BugReporter::EmitBasicReport(const char* name, const char* str,
+                                  SourceLocation Loc,
+                                  SourceRange* RBeg, unsigned NumRanges) {
+  EmitBasicReport(name, "", str, Loc, RBeg, NumRanges);
+}
+  
+void BugReporter::EmitBasicReport(const char* name, const char* category,
+                                  const char* str, SourceLocation Loc,
+                                  SourceRange* RBeg, unsigned NumRanges) {
   
-  SimpleBugType BT(name);
+  SimpleBugType BT(name, category, 0);
   DiagCollector C(BT);
   Diagnostic& Diag = getDiagnostic();
   Diag.Report(&C, getContext().getFullLoc(Loc),
index 25841cd8db57e87abc7cc27dcc4c649d8fa96824..dcea4a6cc0ce6d58beb899c7444bf352aeb864b2 100644 (file)
@@ -2020,6 +2020,10 @@ namespace {
     const CFRefCount& getTF() const { return TF; }
 
     virtual bool isLeak() const { return false; }
+
+    const char* getCategory() const { 
+      return "Memory (Core Foundation/Objective-C)";
+    }
   };
   
   class VISIBILITY_HIDDEN UseAfterRelease : public CFRefBug {
@@ -2027,7 +2031,7 @@ namespace {
     UseAfterRelease(CFRefCount& tf) : CFRefBug(tf) {}
     
     virtual const char* getName() const {
-      return "Use-After-Release";
+      return "use-after-release";
     }
     virtual const char* getDescription() const {
       return "Reference-counted object is used after it is released.";
@@ -2041,7 +2045,7 @@ namespace {
     BadRelease(CFRefCount& tf) : CFRefBug(tf) {}
     
     virtual const char* getName() const {
-      return "Bad Release";
+      return "bad release";
     }
     virtual const char* getDescription() const {
       return "Incorrect decrement of the reference count of a "
@@ -2059,13 +2063,13 @@ namespace {
     virtual const char* getName() const {
       
       if (getTF().isGCEnabled())
-        return "Memory Leak (GC)";
+        return "Leak (GC)";
       
       if (getTF().getLangOptions().getGCMode() == LangOptions::HybridGC)
-        return "Memory Leak (Hybrid MM, non-GC)";
+        return "leak (hybrid MM, non-GC)";
       
       assert (getTF().getLangOptions().getGCMode() == LangOptions::NonGC);
-      return "Memory Leak";
+      return "leak";
     }
     
     virtual const char* getDescription() const {
index 73cb3f786b2c134db5378b3bbb9b62daf5786905..d87bfb1964ecd7a31957200f226c3980635b6a1e 100644 (file)
@@ -59,19 +59,19 @@ public:
       case DeadIncrement:
         BugType = "dead increment";
       case Standard:
-        if (!BugType) BugType = "dead store";
+        if (!BugType) BugType = "dead assignment";
         msg = "Value stored to '" + name + "' is never read";
         break;
         
       case Enclosing:
-        BugType = "dead store";
+        BugType = "dead nested assignment";
         msg = "Although the value stored to '" + name +
           "' is used in the enclosing expression, the value is never actually"
           " read from '" + name + "'";
         break;
     }
       
-    BR.EmitBasicReport(BugType, msg.c_str(), L, R);      
+    BR.EmitBasicReport(BugType, "Dead Store", msg.c_str(), L, R);      
   }
   
   void CheckVarDecl(VarDecl* VD, Expr* Ex, Expr* Val,
index 0c5f078e56f780898f05c263cb8bb427bee4a40f..92c448cb2f4ef451fefa942c5405ece22261bd82 100644 (file)
@@ -293,7 +293,7 @@ class VISIBILITY_HIDDEN CheckAttrNonNull : public GRSimpleAPICheck {
   
 public:
   CheckAttrNonNull() :
-  BT("'nonnull' argument passed null",
+  BT("'nonnull' argument passed null", "API",
      "Null pointer passed as an argument to a 'nonnull' parameter") {}
 
   virtual bool Audit(ExplodedNode<GRState>* N, GRStateManager& VMgr) {
index 5025e87e59684f62fa84469ca9d8853c5b74a844..22d3da9320e266b24c427d1da74b651180ce4f96 100644 (file)
@@ -259,6 +259,15 @@ void HTMLDiagnostics::ReportDiag(const PathDiagnostic& D) {
     R.InsertStrBefore(SourceLocation::getFileLoc(FileID, 0), os.str());
   }
   
+  const std::string& BugCategory = D.getCategory();
+  
+  if (!BugCategory.empty()) {
+    std::string s;
+    llvm::raw_string_ostream os(s);
+    os << "\n<!-- BUGCATEGORY " << BugCategory << " -->\n";
+    R.InsertStrBefore(SourceLocation::getFileLoc(FileID, 0), os.str());
+  }
+  
   {
     std::string s;
     llvm::raw_string_ostream os(s);