<div dir="auto"><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jul 1, 2024, 4:43 PM Jonathan Wakely <<a href="mailto:jwakely@redhat.com">jwakely@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 29/06/24 22:42 -0700, H.J. Lu wrote:<br>
>GCC 15 may fold new and delete pairs, like<br>
><br>
>  A *bb = new A[10];<br>
>  delete [] bb;<br>
>  bb = new (std::nothrow) A [10];<br>
>  delete [] bb;<br>
><br>
>as shown in<br>
><br>
><a href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115712" rel="noreferrer noreferrer" target="_blank">https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115712</a><br>
><br>
>Avoid folding new and delete pairs by adding a function call between new<br>
>and delete.<br>
><br>
>       * testsuite/ld-elf/dl5.cc: Include "dl5.h".<br>
>       (A): Removed.<br>
>       Call foo between new and delete.<br>
>       * testsuite/ld-elf/dl5.h: New file.<br>
>       * testsuite/ld-elf/new.cc: Include "dl5.h".<br>
>       (foo): New function.<br>
><br>
>Signed-off-by: H.J. Lu <<a href="mailto:hjl.tools@gmail.com" target="_blank" rel="noreferrer">hjl.tools@gmail.com</a>><br>
>---<br>
> ld/testsuite/ld-elf/dl5.cc | 13 +++----------<br>
> ld/testsuite/ld-elf/dl5.h  | 10 ++++++++++<br>
> ld/testsuite/ld-elf/new.cc |  6 ++++++<br>
> 3 files changed, 19 insertions(+), 10 deletions(-)<br>
> create mode 100644 ld/testsuite/ld-elf/dl5.h<br>
><br>
>diff --git a/ld/testsuite/ld-elf/dl5.cc b/ld/testsuite/ld-elf/dl5.cc<br>
>index cc404553f93..77dbb62f3d5 100644<br>
>--- a/ld/testsuite/ld-elf/dl5.cc<br>
>+++ b/ld/testsuite/ld-elf/dl5.cc<br>
>@@ -1,6 +1,7 @@<br>
> #include <stdio.h><br>
> #include <stdlib.h><br>
> #include <new><br>
>+#include "dl5.h"<br>
><br>
> int pass = 0;<br>
><br>
>@@ -30,22 +31,14 @@ operator delete (void *ptr) throw ()<br>
>     free (ptr);<br>
> }<br>
><br>
>-class A<br>
>-{<br>
>-public:<br>
>-  A() {}<br>
>-  ~A() { }<br>
>-  int a;<br>
>-  int b;<br>
>-};<br>
>-<br>
>-<br>
> int<br>
> main (void)<br>
> {<br>
>   A *bb = new A[10];<br>
>   delete [] bb;<br>
>+  foo (bb);<br>
<br>
Shouldn't this call be *before* deleting the memory? bb is an invalid<br>
pointer value at this point, and so copying it to initialize the<br>
parameter of foo(A*) has implementation-defined behaviour. It's fine<br>
with GCC, but could in theory trap for some implementations.<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">I checked in a fix.</div><div dir="auto"><br></div><div dir="auto">Thanks.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<br>
>   bb = new (std::nothrow) A [10];<br>
>+  foo (bb);<br>
>   delete [] bb;<br>
><br>
>   if (pass == 4)<br>
>diff --git a/ld/testsuite/ld-elf/dl5.h b/ld/testsuite/ld-elf/dl5.h<br>
>new file mode 100644<br>
>index 00000000000..0d4a7c1bfa3<br>
>--- /dev/null<br>
>+++ b/ld/testsuite/ld-elf/dl5.h<br>
>@@ -0,0 +1,10 @@<br>
>+class A<br>
>+{<br>
>+public:<br>
>+  A() {}<br>
>+  ~A() { }<br>
>+  int a;<br>
>+  int b;<br>
>+};<br>
>+<br>
>+extern void foo (A *);<br>
>diff --git a/ld/testsuite/ld-elf/new.cc b/ld/testsuite/ld-elf/new.cc<br>
>index 513cf2f3ad6..b038d770c6d 100644<br>
>--- a/ld/testsuite/ld-elf/new.cc<br>
>+++ b/ld/testsuite/ld-elf/new.cc<br>
>@@ -1,4 +1,5 @@<br>
> #include <new><br>
>+#include "dl5.h"<br>
><br>
> using std::bad_alloc;<br>
><br>
>@@ -45,3 +46,8 @@ operator new[] (std::size_t sz, const std::nothrow_t& nothrow) throw()<br>
> {<br>
>   return ::operator new(sz, nothrow);<br>
> }<br>
>+<br>
>+void<br>
>+foo (A *)<br>
>+{<br>
>+}<br>
>-- <br>
>2.45.2<br>
><br>
<br>
</blockquote></div></div></div>