aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2024-12-22 21:34:19 +0100
committerHarald Anlauf <anlauf@gmx.de>2024-12-22 21:34:19 +0100
commit2a474c28e573b8604b5fa2584f276d7b7b584cde (patch)
tree99983b0e65e201a94850afa422aecc64fc14bcfb
parent9e1063ca1c854b13950597fd4a14aff4f15ed822 (diff)
downloadgcc-2a474c28e573b8604b5fa2584f276d7b7b584cde.zip
gcc-2a474c28e573b8604b5fa2584f276d7b7b584cde.tar.gz
gcc-2a474c28e573b8604b5fa2584f276d7b7b584cde.tar.bz2
Fortran: fix front-end GMP memleaks
gcc/fortran/ChangeLog: * check.cc (gfc_check_random_seed): Clear gmp variables returned by gfc_array_size. * expr.cc (gfc_check_pointer_assign): Likewise.
-rw-r--r--gcc/fortran/check.cc32
-rw-r--r--gcc/fortran/expr.cc14
2 files changed, 31 insertions, 15 deletions
diff --git a/gcc/fortran/check.cc b/gcc/fortran/check.cc
index f10e665..f4fde83 100644
--- a/gcc/fortran/check.cc
+++ b/gcc/fortran/check.cc
@@ -7155,12 +7155,16 @@ gfc_check_random_seed (gfc_expr *size, gfc_expr *put, gfc_expr *get)
if (!kind_value_check (put, 1, gfc_default_integer_kind))
return false;
- if (gfc_array_size (put, &put_size)
- && mpz_get_ui (put_size) < seed_size)
- gfc_error ("Size of %qs argument of %qs intrinsic at %L "
- "too small (%i/%i)",
- gfc_current_intrinsic_arg[1]->name, gfc_current_intrinsic,
- &put->where, (int) mpz_get_ui (put_size), seed_size);
+ if (gfc_array_size (put, &put_size))
+ {
+ if (mpz_get_ui (put_size) < seed_size)
+ gfc_error ("Size of %qs argument of %qs intrinsic at %L "
+ "too small (%i/%i)",
+ gfc_current_intrinsic_arg[1]->name,
+ gfc_current_intrinsic,
+ &put->where, (int) mpz_get_ui (put_size), seed_size);
+ mpz_clear (put_size);
+ }
}
if (get != NULL)
@@ -7187,12 +7191,16 @@ gfc_check_random_seed (gfc_expr *size, gfc_expr *put, gfc_expr *get)
if (!kind_value_check (get, 2, gfc_default_integer_kind))
return false;
- if (gfc_array_size (get, &get_size)
- && mpz_get_ui (get_size) < seed_size)
- gfc_error ("Size of %qs argument of %qs intrinsic at %L "
- "too small (%i/%i)",
- gfc_current_intrinsic_arg[2]->name, gfc_current_intrinsic,
- &get->where, (int) mpz_get_ui (get_size), seed_size);
+ if (gfc_array_size (get, &get_size))
+ {
+ if (mpz_get_ui (get_size) < seed_size)
+ gfc_error ("Size of %qs argument of %qs intrinsic at %L "
+ "too small (%i/%i)",
+ gfc_current_intrinsic_arg[2]->name,
+ gfc_current_intrinsic,
+ &get->where, (int) mpz_get_ui (get_size), seed_size);
+ mpz_clear (get_size);
+ }
}
/* RANDOM_SEED may not have more than one non-optional argument. */
diff --git a/gcc/fortran/expr.cc b/gcc/fortran/expr.cc
index a349d98..dad383a 100644
--- a/gcc/fortran/expr.cc
+++ b/gcc/fortran/expr.cc
@@ -4364,16 +4364,24 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue,
/* If this can be determined, check that the target must be at least as
large as the pointer assigned to it is. */
- if (gfc_array_size (lvalue, &lsize)
- && gfc_array_size (rvalue, &rsize)
- && mpz_cmp (rsize, lsize) < 0)
+ bool got_lsize = gfc_array_size (lvalue, &lsize);
+ bool got_rsize = got_lsize && gfc_array_size (rvalue, &rsize);
+ bool too_small = got_rsize && mpz_cmp (rsize, lsize) < 0;
+
+ if (too_small)
{
gfc_error ("Rank remapping target is smaller than size of the"
" pointer (%ld < %ld) at %L",
mpz_get_si (rsize), mpz_get_si (lsize),
&lvalue->where);
+ mpz_clear (lsize);
+ mpz_clear (rsize);
return false;
}
+ if (got_lsize)
+ mpz_clear (lsize);
+ if (got_rsize)
+ mpz_clear (rsize);
/* An assumed rank target is an experimental F202y feature. */
if (rvalue->rank == -1 && !(gfc_option.allow_std & GFC_STD_F202Y))