BugReporter::StrBugTypes: Use unique_ptr to simplify memory management
authorDavid Blaikie <dblaikie@gmail.com>
Wed, 29 Apr 2020 02:14:58 +0000 (19:14 -0700)
committerDavid Blaikie <dblaikie@gmail.com>
Wed, 29 Apr 2020 05:31:16 +0000 (22:31 -0700)
clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h
clang/lib/StaticAnalyzer/Core/BugReporter.cpp

index d45c4b7..5156552 100644 (file)
@@ -589,7 +589,7 @@ private:
   std::vector<BugReportEquivClass *> EQClassesVector;
 
 public:
-  BugReporter(BugReporterData &d) : D(d) {}
+  BugReporter(BugReporterData &d);
   virtual ~BugReporter();
 
   /// Generate and flush diagnostics for all bug reports.
@@ -632,7 +632,7 @@ public:
                        ArrayRef<FixItHint> Fixits = None);
 
 private:
-  llvm::StringMap<BugType *> StrBugTypes;
+  llvm::StringMap<std::unique_ptr<BugType>> StrBugTypes;
 
   /// Returns a BugType that is associated with the given name and
   /// category.
index 0848d6a..efae511 100644 (file)
@@ -2390,6 +2390,7 @@ ProgramStateManager &PathSensitiveBugReporter::getStateManager() const {
   return Eng.getStateManager();
 }
 
+BugReporter::BugReporter(BugReporterData &d) : D(d) {}
 BugReporter::~BugReporter() {
   // Make sure reports are flushed.
   assert(StrBugTypes.empty() &&
@@ -2410,7 +2411,7 @@ void BugReporter::FlushReports() {
   // EmitBasicReport.
   // FIXME: There are leaks from checkers that assume that the BugTypes they
   // create will be destroyed by the BugReporter.
-  llvm::DeleteContainerSeconds(StrBugTypes);
+  StrBugTypes.clear();
 }
 
 //===----------------------------------------------------------------------===//
@@ -3263,8 +3264,8 @@ BugType *BugReporter::getBugTypeForName(CheckerNameRef CheckName,
   SmallString<136> fullDesc;
   llvm::raw_svector_ostream(fullDesc) << CheckName.getName() << ":" << name
                                       << ":" << category;
-  BugType *&BT = StrBugTypes[fullDesc];
+  std::unique_ptr<BugType> &BT = StrBugTypes[fullDesc];
   if (!BT)
-    BT = new BugType(CheckName, name, category);
-  return BT;
+    BT = std::make_unique<BugType>(CheckName, name, category);
+  return BT.get();
 }