This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA] dwarf2expr.c: Fix some stack [re]allocation problems


Ping!

--- Forwarded mail from Kevin Buettner <kevinb@redhat.com>

Date: Wed, 23 Apr 2003 16:45:26 -0700
From: Kevin Buettner <kevinb@redhat.com>
To: gdb-patches@sources.redhat.com
Subject: [RFA] dwarf2expr.c: Fix some stack [re]allocation problems

The patch below fixes some problems with the dwarf expression stack.

First, the stack is not being initialized correctly.  The
``stack_len'' member indicates the position of the top of the stack
and it was being set to 10.  This value should be zero, and, as a
consequence, none of the underflow checking code was actually working
properly.  Furthermore, the field which indicates the amount of space
actually allocated wasn't being initialized at all!

The function which grows the stack also has a bug.  It uses a loop
which doubles the new size so long as that size isn't yet large enough
to accomodate the new space request.  The problem with this is that if
the size starts out at zero, the loop will never terminate.  Computing
this sort of thing with a loop is silly anyway, so I've simplified the
mechanism used to allocate more space.  It seems unlikely that the
DWARF 2 expression stack will grow very quickly, hence the new code is
conservative and allocates a mere 10 elements (at a time) more than
required.

Okay?

	* dwarf2expr.c (new_dwarf_expr_context): Set ``stack_len'' to
	correctly indicate an empty stack and ``stack_allocated'' to the
	indicate the number of elements initially allocated.
	(dwarf_expr_grow_stack): Simplify method for computing new
	stack size.  Don't loop infinitely if ``stack_len'' is zero.

Index: dwarf2expr.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2expr.c,v
retrieving revision 1.6
diff -u -p -r1.6 dwarf2expr.c
--- dwarf2expr.c	13 Apr 2003 15:53:44 -0000	1.6
+++ dwarf2expr.c	23 Apr 2003 23:19:38 -0000
@@ -39,8 +39,9 @@ new_dwarf_expr_context (void)
 {
   struct dwarf_expr_context *retval;
   retval = xcalloc (1, sizeof (struct dwarf_expr_context));
-  retval->stack_len = 10;
-  retval->stack = xmalloc (10 * sizeof (CORE_ADDR));
+  retval->stack_len = 0;
+  retval->stack_allocated = 10;
+  retval->stack = xmalloc (retval->stack_allocated * sizeof (CORE_ADDR));
   return retval;
 }
 
@@ -61,12 +62,10 @@ dwarf_expr_grow_stack (struct dwarf_expr
 {
   if (ctx->stack_len + need > ctx->stack_allocated)
     {
-      size_t templen = ctx->stack_len * 2;
-      while (templen < (ctx->stack_len + need))
-	   templen *= 2;
+      size_t newlen = ctx->stack_len + need + 10;
       ctx->stack = xrealloc (ctx->stack,
-			     templen * sizeof (CORE_ADDR));
-      ctx->stack_allocated = templen;
+			     newlen * sizeof (CORE_ADDR));
+      ctx->stack_allocated = newlen;
     }
 }
 


--- End of forwarded mail from Kevin Buettner <kevinb@redhat.com>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]