This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [RFA] dwarf2expr.c: Fix some stack [re]allocation problems
- From: Elena Zannoni <ezannoni at redhat dot com>
- To: Kevin Buettner <kevinb at redhat dot com>
- Cc: gdb-patches at sources dot redhat dot com
- Date: Wed, 7 May 2003 19:02:54 -0400
- Subject: Re: [RFA] dwarf2expr.c: Fix some stack [re]allocation problems
- References: <1030423234526.ZM13643@localhost.localdomain><1030507223951.ZM32198@localhost.localdomain>
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>