bug-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Possibly Memory Leak Bug - yypstate_delete


From: Joel E. Denny
Subject: Re: Possibly Memory Leak Bug - yypstate_delete
Date: Sat, 28 Jul 2007 00:30:26 -0400 (EDT)

On Fri, 27 Jul 2007, Joel E. Denny wrote:

> On Fri, 27 Jul 2007, Brandon Lucia wrote:
> 
> > I've been using the push_parse features in 2.3a+ HEAD from cvs and I think
> > I've discovered a memory leak.
> 
> Thanks for the bug report.  Are you finding that this yyss memory leak 
> only occurs when you call yypstate_delete while yypush_parse is still 
> returning YYPUSH_MORE?

I committed the following to fix the above scenario.

> If you are finding that it happens even after the 
> parse completes (syntax error, success, or even memory exhaustion)

As far as I can tell, the above scenario never happens.

Please let us know if you find any other problems.  Push parsing 
definitely needs more testing... especially in scenarios that, like yours, 
are impossible for pull parsing.

Index: ChangeLog
===================================================================
RCS file: /sources/bison/bison/ChangeLog,v
retrieving revision 1.1713
diff -p -u -r1.1713 ChangeLog
--- ChangeLog   17 Jul 2007 06:56:35 -0000      1.1713
+++ ChangeLog   28 Jul 2007 04:22:07 -0000
@@ -1,3 +1,15 @@
+2007-07-27  Joel E. Denny  <address@hidden>
+
+       Fix push parsing memory leak reported by Brandon Lucia at
+       <http://lists.gnu.org/archive/html/bug-bison/2007-07/msg00032.html>.
+       * THANKS: Add Brandon Lucia.
+       * data/push.c (yypstate_delete): Free the stack if it was reallocated
+       but the parse never completed and thus freed it.
+       * tests/Makefile.am (TESTSUITE_AT): Add push.at.
+       * tests/testsuite.at: Include push.at.
+       * test/push.at: New.
+       (Push Parsing: Memory Leak for Early Deletion): New test case.
+
 2007-07-17  Joel E. Denny  <address@hidden>
 
        Improve handling of multiple S/R conflicts in the same state and of S/R
Index: THANKS
===================================================================
RCS file: /sources/bison/bison/THANKS,v
retrieving revision 1.74
diff -p -u -r1.74 THANKS
--- THANKS      26 May 2007 19:10:43 -0000      1.74
+++ THANKS      28 Jul 2007 04:22:07 -0000
@@ -15,6 +15,7 @@ Baron Schwartz            address@hidden
 Benoit Perrot             address@hidden
 Bert Deknuydt             address@hidden
 Bob Rossi                 address@hidden
+Brandon Lucia             address@hidden
 Bruce Lilly               address@hidden
 Bruno Haible              address@hidden
 Charles-Henri de Boysson  address@hidden
Index: data/push.c
===================================================================
RCS file: /sources/bison/bison/data/push.c,v
retrieving revision 1.38
diff -p -u -r1.38 push.c
--- data/push.c 24 Feb 2007 05:43:35 -0000      1.38
+++ data/push.c 28 Jul 2007 04:22:07 -0000
@@ -1124,6 +1124,12 @@ b4_push_if(
 ]b4_c_function_def([[yypstate_delete]], [[void]],
                    [[[yypstate *yyps]], [[yyps]]])[
 {
+#ifndef yyoverflow
+  /* If the stack was reallocated but the parse did not complete, then the
+     stack still needs to be freed.  */
+  if (!yyps->yynew && yyps->yyss != yyps->yyssa)
+    YYSTACK_FREE (yyps->yyss);
+#endif
   free (yyps);
 }
 
Index: tests/Makefile.am
===================================================================
RCS file: /sources/bison/bison/tests/Makefile.am,v
retrieving revision 1.46
diff -p -u -r1.46 Makefile.am
--- tests/Makefile.am   29 Jan 2007 10:54:42 -0000      1.46
+++ tests/Makefile.am   28 Jul 2007 04:22:07 -0000
@@ -53,7 +53,8 @@ TESTSUITE_AT = \
         torture.at existing.at regression.at \
         c++.at \
         java.at \
-       cxx-type.at glr-regression.at
+       cxx-type.at glr-regression.at \
+       push.at
 
 TESTSUITE = $(srcdir)/testsuite
 
Index: tests/push.at
===================================================================
RCS file: tests/push.at
diff -N tests/push.at
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ tests/push.at       28 Jul 2007 04:22:07 -0000
@@ -0,0 +1,82 @@
+# Checking Push Parsing.                            -*- Autotest -*-
+# Copyright (C) 2007 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+AT_BANNER([[Push Parsing Tests]])
+
+## ---------------------------------------------- ##
+## Push Parsing: Memory Leak for Early Deletion.  ##
+## ---------------------------------------------- ##
+
+AT_SETUP([[Push Parsing: Memory Leak for Early Deletion]])
+
+# Requires Valgrind.
+
+AT_DATA_GRAMMAR([[input.y]],
+[[
+%{
+  #include <assert.h>
+  #include <stdio.h>
+  #define YYINITDEPTH 1
+  void yyerror (char const *msg);
+%}
+
+%pure-parser %push-parser
+
+%%
+
+start: 'a' 'b' 'c' ;
+
+%%
+
+void
+yyerror (char const *msg)
+{
+  fprintf (stderr, "%s\n", msg);
+}
+
+int
+main (void)
+{
+  yypstate *yyps;
+  YYSTYPE yylval;
+
+  /* Make sure we don't try to free yyps->yyss in this case.  */
+  yyps = yypstate_new ();
+  yypstate_delete (yyps);
+
+  /* yypstate_delete used to leak yyps->yyss if the stack was reallocated but
+     the parse did not return on success, syntax error, or memory
+     exhaustion.  */
+  yyps = yypstate_new ();
+  assert (yypush_parse (yyps, 'a', &yylval) == YYPUSH_MORE);
+  yypstate_delete (yyps);
+
+  yyps = yypstate_new ();
+  assert (yypush_parse (yyps, 'a', &yylval) == YYPUSH_MORE);
+  assert (yypush_parse (yyps, 'b', &yylval) == YYPUSH_MORE);
+  yypstate_delete (yyps);
+
+  return 0;
+}
+]])
+
+AT_CHECK([[bison -o input.c input.y]])
+AT_COMPILE([[input]])
+AT_PARSER_CHECK([[./input]])
+
+AT_CLEANUP
Index: tests/testsuite.at
===================================================================
RCS file: /sources/bison/bison/tests/testsuite.at,v
retrieving revision 1.34
diff -p -u -r1.34 testsuite.at
--- tests/testsuite.at  29 Jan 2007 10:54:42 -0000      1.34
+++ tests/testsuite.at  28 Jul 2007 04:22:07 -0000
@@ -80,5 +80,8 @@ m4_include([cxx-type.at])
 # Regression tests
 m4_include([glr-regression.at])
 
+# Push parsing specific tests.
+m4_include([push.at])
+
 m4_popdef([AT_CHECK])
 m4_popdef([ORIGINAL_AT_CHECK])




reply via email to

[Prev in Thread] Current Thread [Next in Thread]