On Tue, Jul 9, 2024 at 3:01 PM Kito Cheng <kito.ch...@sifive.com> wrote: > > IIRC Jeff mentions that it may introduce buffer overflow if the input > string is long enough.
The manpage states: If the allocation causes stack overflow, program behavior is undefined. This was considered reasonable for AArch64: https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/config/aarch64/aarch64.cc;h=7f0cc47d0f071de9297068baa85c6d5fc4d7fa5b;hb=HEAD#l19408 So, my assumption was that it should be fine for RISC-V as well. However, I won't insist on this patch. > > 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 > >