diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-03-20 15:45:06 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-03-20 15:45:06 +0000 |
commit | 6493b8153a56cbff9f89c1a53f04b6af424b383a (patch) | |
tree | 3d186a3aa48594f22b7ec5e64ec64b4e29634a16 | |
parent | 84d1e6e443b90275539a4e5b2dd94ae63c5ff19a (diff) |
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
-rw-r--r-- | include/clang/Checker/BugReporter/BugReporter.h | 12 |
1 files 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 <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(); } |