[PATCH] argp-parse: Get rid of alloca

Joe Simmons-Talbott josimmon@redhat.com
Tue Aug 15 14:49:12 GMT 2023


On Thu, Aug 03, 2023 at 09:10:49AM -0400, Joe Simmons-Talbott via Libc-alpha wrote:
> On Thu, Jul 13, 2023 at 08:48:13AM -0400, Joe Simmons-Talbott wrote:
> > Even though the alloca usage is relatively small and fixed size the code
> > can be written without using alloca.  Convert to local variables.
> 
> Ping.
Ping.

Thanks,
Joe
> 
> Thanks,
> Joe
> > 
> > Checked on x86_64-linux-gnu.
> > ---
> >  argp/argp-parse.c | 20 +++++++++++---------
> >  1 file changed, 11 insertions(+), 9 deletions(-)
> > 
> > diff --git a/argp/argp-parse.c b/argp/argp-parse.c
> > index a44b50f8e4..40a5896d21 100644
> > --- a/argp/argp-parse.c
> > +++ b/argp/argp-parse.c
> > @@ -884,6 +884,9 @@ __argp_parse (const struct argp *argp, int argc, char **argv, unsigned flags,
> >    error_t err;
> >    struct parser parser;
> >  
> > +  struct argp_child child[4];
> > +  struct argp top_argp;
> > +
> >    /* If true, then err == EBADKEY is a result of a non-option argument failing
> >       to be parsed (which in some cases isn't actually an error).  */
> >    int arg_ebadkey = 0;
> > @@ -891,24 +894,23 @@ __argp_parse (const struct argp *argp, int argc, char **argv, unsigned flags,
> >    if (! (flags & ARGP_NO_HELP))
> >      /* Add our own options.  */
> >      {
> > -      struct argp_child *child = alloca (4 * sizeof (struct argp_child));
> > -      struct argp *top_argp = alloca (sizeof (struct argp));
> > +      int child_index = 0;
> >  
> >        /* TOP_ARGP has no options, it just serves to group the user & default
> >  	 argps.  */
> > -      memset (top_argp, 0, sizeof (*top_argp));
> > -      top_argp->children = child;
> > +      memset (&top_argp, 0, sizeof (struct argp));
> > +      top_argp.children = child;
> >  
> >        memset (child, 0, 4 * sizeof (struct argp_child));
> >  
> >        if (argp)
> > -	(child++)->argp = argp;
> > -      (child++)->argp = &argp_default_argp;
> > +	child[child_index++].argp = argp;
> > +      child[child_index++].argp = &argp_default_argp;
> >        if (argp_program_version || argp_program_version_hook)
> > -	(child++)->argp = &argp_version_argp;
> > -      child->argp = 0;
> > +	child[child_index++].argp = &argp_version_argp;
> > +      child[child_index].argp = 0;
> >  
> > -      argp = top_argp;
> > +      argp = &top_argp;
> >      }
> >  
> >    /* Construct a parser for these arguments.  */
> > -- 
> > 2.39.2
> > 
> 



More information about the Libc-alpha mailing list