aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Duff <duff@adacore.com>2023-12-15 16:59:43 -0500
committerMarc Poulhiès <poulhies@adacore.com>2024-05-06 11:11:26 +0200
commit4629cd34506416d05cd9ab56879f69b44fe65d2b (patch)
tree5e214195bfb80f5c5d015d181787cb27289377aa
parent6be1fe296e58128b994a1b877a45b459a2dadf06 (diff)
downloadgcc-4629cd34506416d05cd9ab56879f69b44fe65d2b.zip
gcc-4629cd34506416d05cd9ab56879f69b44fe65d2b.tar.gz
gcc-4629cd34506416d05cd9ab56879f69b44fe65d2b.tar.bz2
ada: Fix memory leak in 'Image
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.
-rw-r--r--gcc/ada/exp_put_image.adb8
1 files changed, 8 insertions, 0 deletions
diff --git a/gcc/ada/exp_put_image.adb b/gcc/ada/exp_put_image.adb
index c298163..182497f 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));