From 6493b8153a56cbff9f89c1a53f04b6af424b383a Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Sat, 20 Mar 2010 15:45:06 +0000 Subject: [PATCH] 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 --- include/clang/Checker/BugReporter/BugReporter.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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(); } -- 2.40.0