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


Kevin Buettner writes:
 > 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?

Sure.

elena


 > 
 > 	* 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]