From: Ted Kremenek Date: Sat, 20 Mar 2010 15:45:06 +0000 (+0000) Subject: Fix use-of-invalid-memory found by Valgrind and Windows buildbots. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6493b8153a56cbff9f89c1a53f04b6af424b383a;p=clang Fix use-of-invalid-memory found by Valgrind and Windows buildbots. 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 --- diff --git a/include/clang/Checker/BugReporter/BugReporter.h b/include/clang/Checker/BugReporter/BugReporter.h index 6c41668cce..3a1527f57b 100644 --- a/include/clang/Checker/BugReporter/BugReporter.h +++ b/include/clang/Checker/BugReporter/BugReporter.h @@ -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 namespace clang { @@ -385,16 +386,19 @@ public: class BugReporterContext { GRBugReporter &BR; - std::vector 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::Factory F; + llvm::ImmutableList 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::iterator visitor_iterator; + typedef llvm::ImmutableList::iterator visitor_iterator; visitor_iterator visitor_begin() { return Callbacks.begin(); } visitor_iterator visitor_end() { return Callbacks.end(); }