ielr: fix crash on memory management

Reported by Dwight Guth.
https://lists.gnu.org/r/bug-bison/2020-06/msg00037.html

* src/AnnotationList.c (AnnotationList__computePredecessorAnnotations):
Beware that SBITSET__FOR_EACH nests _two_ for-loops, so "break" does
not actually break out of it.
That was the only occurrence in the code.
* src/Sbitset.h (SBITSET__FOR_EACH): Warn passersby.
This commit is contained in:
Akim Demaille
2020-06-26 07:33:51 +02:00
parent 8f44164443
commit cf6d8d0631
4 changed files with 10 additions and 1 deletions

4
NEWS
View File

@@ -44,6 +44,10 @@ GNU Bison NEWS
string aliases semantically equivalent but syntactically different (e.g., string aliases semantically equivalent but syntactically different (e.g.,
"A", "\x41", "\101") are considered to be different. "A", "\x41", "\101") are considered to be different.
*** Crash when generating IELR
An old, well hidden, bug in the generation of IELR parsers was fixed.
** New features ** New features
*** File prefix mapping *** File prefix mapping

1
THANKS
View File

@@ -59,6 +59,7 @@ Di-an Jan dianj@freeshell.org
Dick Streefland dick.streefland@altium.nl Dick Streefland dick.streefland@altium.nl
Didier Godefroy dg@ulysium.net Didier Godefroy dg@ulysium.net
Don Macpherson donmac703@gmail.com Don Macpherson donmac703@gmail.com
Dwight Guth dwight.guth@runtimeverification.com
Efi Fogel efifogel@gmail.com Efi Fogel efifogel@gmail.com
Enrico Scholz enrico.scholz@informatik.tu-chemnitz.de Enrico Scholz enrico.scholz@informatik.tu-chemnitz.de
Eric Blake ebb9@byu.net Eric Blake ebb9@byu.net

View File

@@ -276,7 +276,8 @@ AnnotationList__computePredecessorAnnotations (
obstack_free (annotations_obstackp, obstack_free (annotations_obstackp,
annotation_node->contributions[ci]); annotation_node->contributions[ci]);
annotation_node->contributions[ci] = NULL; annotation_node->contributions[ci] = NULL;
break; // "Break" out of SBITSET__FOR_EACH.
goto after_sbitset__for_each;
} }
else else
{ {
@@ -309,6 +310,7 @@ AnnotationList__computePredecessorAnnotations (
predecessor_item); predecessor_item);
} }
} }
after_sbitset__for_each:;
} }
if (annotation_node->contributions[ci]) if (annotation_node->contributions[ci])
{ {

View File

@@ -81,6 +81,8 @@ void Sbitset__fprint (Sbitset self, Sbitset__Index nbits, FILE *file);
*ptr_self = *ptr_other1 | *ptr_other2; \ *ptr_self = *ptr_other1 | *ptr_other2; \
} while (0) } while (0)
/* ATTENTION: there are *two* loops here, "break" and "continue" will
not apply to the whole loop, just the inner one. */
# define SBITSET__FOR_EACH(SELF, NBITS, ITER, INDEX) \ # define SBITSET__FOR_EACH(SELF, NBITS, ITER, INDEX) \
for ((ITER) = (SELF); (ITER) < (SELF) + Sbitset__nbytes (NBITS); ++(ITER)) \ for ((ITER) = (SELF); (ITER) < (SELF) + Sbitset__nbytes (NBITS); ++(ITER)) \
if (*(ITER) != 0) \ if (*(ITER) != 0) \