[PATCH] argp-parse: Get rid of alloca
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Mon Aug 28 16:44:19 GMT 2023
On 13/07/23 09:48, Joe Simmons-Talbott via Libc-alpha wrote:
> Even though the alloca usage is relatively small and fixed size the code
> can be written without using alloca. Convert to local variables.
>
> Checked on x86_64-linux-gnu.
You can also remove all the boilerplate that define alloca at the start.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> 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. */
More information about the Libc-alpha
mailing list