]> granicus.if.org Git - clang/commitdiff
Fix use-of-invalid-memory found by Valgrind and Windows buildbots.
authorTed Kremenek <kremenek@apple.com>
Sat, 20 Mar 2010 15:45:06 +0000 (15:45 +0000)
committerTed Kremenek <kremenek@apple.com>
Sat, 20 Mar 2010 15:45:06 +0000 (15:45 +0000)
We were inserting a value into a std::vector<> while iterating over
it, which could cause the underlying memory to get deallocated
and reallocated.  While not the best solution, use an llvm::ImmutableList
for now as it is safely supports insertions during iteration.

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

include/clang/Checker/BugReporter/BugReporter.h

index 6c41668ccece048ed413c7665a976fd3c357a738..3a1527f57bf132e8112ffbc3962b5285306332de 100644 (file)
@@ -24,6 +24,7 @@
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/ImmutableSet.h"
+#include "llvm/ADT/ImmutableList.h"
 #include <list>
 
 namespace clang {
@@ -385,16 +386,19 @@ public:
 
 class BugReporterContext {
   GRBugReporter &BR;
-  std::vector<BugReporterVisitor*> Callbacks;
+  // Not the most efficient data structure, but we use an ImmutableList for the
+  // Callbacks because it is safe to make additions to list during iteration.
+  llvm::ImmutableList<BugReporterVisitor*>::Factory F;
+  llvm::ImmutableList<BugReporterVisitor*> Callbacks;
 public:
-  BugReporterContext(GRBugReporter& br) : BR(br) {}
+  BugReporterContext(GRBugReporter& br) : BR(br), Callbacks(F.GetEmptyList()) {}
   virtual ~BugReporterContext();
 
   void addVisitor(BugReporterVisitor* visitor) {
-    if (visitor) Callbacks.push_back(visitor);
+    if (visitor) Callbacks = F.Add(visitor, Callbacks);
   }
 
-  typedef std::vector<BugReporterVisitor*>::iterator visitor_iterator;
+  typedef llvm::ImmutableList<BugReporterVisitor*>::iterator visitor_iterator;
   visitor_iterator visitor_begin() { return Callbacks.begin(); }
   visitor_iterator visitor_end() { return Callbacks.end(); }