diff mbox series

[COMMITTED] ada: Fix memory leak in 'Image

Message ID 20240506091759.1585137-1-poulhies@adacore.com
State New
Headers show
Series [COMMITTED] ada: Fix memory leak in 'Image | expand

Commit Message

Marc Poulhiès May 6, 2024, 9:17 a.m. UTC
From: Bob Duff <duff@adacore.com>

Fix memory leak in 'Image by managing the secondary stack
in scopes that call the new Ada 2020 'Image, which calls 'Put_Image
and then Get, which returns on the secondary stack.

gcc/ada/

	* exp_put_image.adb (Build_Image_Call): Call Set_Uses_Sec_Stack on
	the current scope. We don't do this at all call sites, because
	there are three; better to do it here.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/exp_put_image.adb | 8 ++++++++
 1 file changed, 8 insertions(+)
diff mbox series

Patch

diff --git a/gcc/ada/exp_put_image.adb b/gcc/ada/exp_put_image.adb
index c298163f36f..182497fb6e8 100644
--- a/gcc/ada/exp_put_image.adb
+++ b/gcc/ada/exp_put_image.adb
@@ -1290,6 +1290,14 @@  package body Exp_Put_Image is
          Actions := New_List (Sink_Decl, Put_Im, Result_Decl);
       end if;
 
+      --  To avoid leaks, we need to manage the secondary stack, because Get is
+      --  returning a String allocated thereon. It might be cleaner to let the
+      --  normal mechanisms for functions returning on the secondary stack call
+      --  Set_Uses_Sec_Stack, but this expansion of 'Image is happening too
+      --  late for that.
+
+      Set_Uses_Sec_Stack (Current_Scope);
+
       return Make_Expression_With_Actions (Loc,
         Actions    => Actions,
         Expression => New_Occurrence_Of (Result_Entity, Loc));