]> granicus.if.org Git - re2c/commitdiff
Fixed use of invalidated iterator after erase on std::map.
authorUlya Trofimovich <skvadrik@gmail.com>
Fri, 8 Feb 2019 23:15:21 +0000 (23:15 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Fri, 8 Feb 2019 23:15:21 +0000 (23:15 +0000)
Problem reported by Denis Naumov.

re2c/src/parse/normalize.cc

index 84a79ab74f861d3730cd61532f8041ed60b6dece..6f16d3841bfa25d75522ee41bd5ce082cde0f90e 100644 (file)
@@ -8,29 +8,25 @@ namespace re2c {
 
 void normalize_ast(specs_t &specs)
 {
-    specs_t::iterator i, b = specs.begin(), e = specs.end();
+    specs_t::iterator i, j, b, e;
 
     // merge <*> rules and <!*> setup to all conditions except "0"
     // star rules must have lower priority than normal rules
-    for (i = b; i != e && i->name != "*"; ++i);
+    for (i = specs.begin(), e = specs.end(); i != e && i->name != "*"; ++i);
     if (i != e) {
-        const specs_t::iterator star = i;
+        for (j = specs.begin(); j != e; ++j) {
+            if (j == i || j->name == "0") continue;
 
-        for (i = b; i != e; ++i) {
-            if (i == star || i->name == "0") continue;
-
-            i->rules.insert(i->rules.end(), star->rules.begin(), star->rules.end());
-            i->defs.insert(i->defs.end(), star->defs.begin(), star->defs.end());
-            i->eofs.insert(i->eofs.end(), star->eofs.begin(), star->eofs.end());
-            i->setup.insert(i->setup.end(), star->setup.begin(), star->setup.end());
+            j->rules.insert(j->rules.end(), i->rules.begin(), i->rules.end());
+            j->defs.insert(j->defs.end(), i->defs.begin(), i->defs.end());
+            j->eofs.insert(j->eofs.end(), i->eofs.begin(), i->eofs.end());
+            j->setup.insert(j->setup.end(), i->setup.begin(), i->setup.end());
         }
-
-        specs.erase(star);
-        e = specs.end();
+        specs.erase(i);
     }
 
     // merge default rule with the lowest priority
-    for (i = b; i != e; ++i) {
+    for (i = specs.begin(), e = specs.end(); i != e; ++i) {
         if (!i->defs.empty()) {
             const Code *c = i->defs[0];
             const AST *r = ast_default(c->fline, 0);
@@ -39,8 +35,8 @@ void normalize_ast(specs_t &specs)
     }
 
     // "0" condition must be the first one
-    for (i = b; i != e && i->name != "0"; ++i);
-    if (i != e && i != b) {
+    for (i = specs.begin(), e = specs.end(); i != e && i->name != "0"; ++i);
+    if (i != specs.end() && i != specs.begin()) {
         const spec_t zero = *i;
         specs.erase(i);
         specs.insert(specs.begin(), zero);