From 2d8def82cac9226f26da5a5e8a89b0ea96f934e0 Mon Sep 17 00:00:00 2001 From: Ryan Mast Date: Sun, 2 Jul 2017 12:59:09 -0700 Subject: [PATCH] Fix for possible invalidated iterator after resize --- re2c/src/dfa/closure.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/re2c/src/dfa/closure.cc b/re2c/src/dfa/closure.cc index 608d6780..29625bb3 100644 --- a/re2c/src/dfa/closure.cc +++ b/re2c/src/dfa/closure.cc @@ -202,7 +202,7 @@ void raw_closure(const closure_t &init, closure_t &done, closure_t *shadow, // drop "inner" states (non-final without outgoing non-epsilon transitions) j = std::partition(b, e, clos_t::ran); e = std::partition(j, e, clos_t::fin); - done.resize(static_cast(e - b)); + size_t n = static_cast(e - b); // drop all final states except one; mark dropped rules as shadowed // see note [at most one final item per closure] @@ -212,8 +212,10 @@ void raw_closure(const closure_t &init, closure_t &done, closure_t *shadow, for (i = j; ++i < e;) { rules[i->state->rule].shadow.insert(l); } - done.resize(static_cast(j - b) + 1); + n = static_cast(j - b) + 1; } + + done.resize(n); } /* note [at most one final item per closure] -- 2.50.1