IIRC Jeff mentions that it may introduce buffer overflow if the input
string is long enough.

On Tue, Jul 9, 2024 at 8:48 PM Christoph Müllner
<christoph.muell...@vrull.eu> wrote:
>
> Allocating an object on the heap with new, wrapping it in a
> std::unique_ptr and finally getting the buffer via buf.get()
> is a correct way to allocate a buffer that is automatically
> freed on return.  However, a simple invocation of alloca()
> does the same with less overhead.
>
> gcc/ChangeLog:
>
>         * config/riscv/riscv-target-attr.cc 
> (riscv_target_attr_parser::parse_arch):
>         Replace new + std::unique_ptr by alloca().
>         (riscv_process_one_target_attr): Likewise.
>         (riscv_process_target_attr): Likewise.
>
> Signed-off-by: Christoph Müllner <christoph.muell...@vrull.eu>
> ---
>  gcc/config/riscv/riscv-target-attr.cc | 9 +++------
>  1 file changed, 3 insertions(+), 6 deletions(-)
>
> diff --git a/gcc/config/riscv/riscv-target-attr.cc 
> b/gcc/config/riscv/riscv-target-attr.cc
> index 19eb7b06d548..e59cc53f23c6 100644
> --- a/gcc/config/riscv/riscv-target-attr.cc
> +++ b/gcc/config/riscv/riscv-target-attr.cc
> @@ -109,8 +109,7 @@ riscv_target_attr_parser::parse_arch (const char *str)
>      {
>        /* Parsing the extension list like "+<ext>[,+<ext>]*".  */
>        size_t len = strlen (str);
> -      std::unique_ptr<char[]> buf (new char[len+1]);
> -      char *str_to_check = buf.get ();
> +      char *str_to_check = (char *) alloca (len + 1);
>        strcpy (str_to_check, str);
>        const char *token = strtok_r (str_to_check, ",", &str_to_check);
>        m_subset_list = riscv_cmdline_subset_list ()->clone ();
> @@ -247,8 +246,7 @@ riscv_process_one_target_attr (char *arg_str,
>        return false;
>      }
>
> -  std::unique_ptr<char[]> buf (new char[len+1]);
> -  char *str_to_check = buf.get();
> +  char *str_to_check = (char *) alloca (len + 1);
>    strcpy (str_to_check, arg_str);
>
>    char *arg = strchr (str_to_check, '=');
> @@ -334,8 +332,7 @@ riscv_process_target_attr (tree fndecl, tree args, 
> location_t loc,
>        return false;
>      }
>
> -  std::unique_ptr<char[]> buf (new char[len+1]);
> -  char *str_to_check = buf.get ();
> +  char *str_to_check = (char *) alloca (len + 1);
>    strcpy (str_to_check, TREE_STRING_POINTER (args));
>
>    /* Used to catch empty spaces between commas i.e.
> --
> 2.45.2
>

Reply via email to