From: Ryan Mast Date: Sun, 2 Jul 2017 19:59:09 +0000 (-0700) Subject: Fix for possible invalidated iterator after resize X-Git-Tag: 1.0~39^2~34 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2d8def82cac9226f26da5a5e8a89b0ea96f934e0;p=re2c Fix for possible invalidated iterator after resize --- 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]