[Patch, fortran] PR29758 - Runtime segfault in RESHAPE with insufficient elements in SOURCE
Paul Thomas
paulthomas2@wanadoo.fr
Fri Nov 10 18:16:00 GMT 2006
Ping!
I would not do this so soon, were I not on my travels again on Sunday.
If it goes to trunk this weekend, it can be committed to 4.2/4.1 the
following weekend.
Cheers
Paul
> :ADDPATCH fortran:
>
> This patch checks to see if there are enough elements in reshape's
> source to match shape, when shape is a constant array and source has a
> constant shape. It is a self explanatory bit of hacking in check.c.
> The testcase checks two obvious errors and checks that a correct one
> goes through.
>
> Regtested Suse10.1/amd64.
>
> OK for trunk, 4.2 and 4.1?
>
> Paul
>
> 2006-11-08 Paul Thomas <pault@gcc.gnu.org>
>
> PR fortran/29758
> * check.c (gfc_check_reshape): Check that there are enough
> elements in the source array as to be able to fill an array
> defined by shape, when pad is absent.
>
> 2006-11-08 Paul Thomas <pault@gcc.gnu.org>
>
> PR fortran/29758
> * gfortran.dg/reshape_source_size_1.f90: New test.
>
>
> ------------------------------------------------------------------------
>
> Index: gcc/fortran/check.c
> ===================================================================
> *** gcc/fortran/check.c (revision 118597)
> --- gcc/fortran/check.c (working copy)
> *************** gfc_check_reshape (gfc_expr * source, gf
> *** 2110,2115 ****
> --- 2110,2116 ----
> gfc_expr * pad, gfc_expr * order)
> {
> mpz_t size;
> + mpz_t nelems;
> int m;
>
> if (array_check (source, 0) == FAILURE)
> *************** gfc_check_reshape (gfc_expr * source, gf
> *** 2149,2154 ****
> --- 2150,2187 ----
> if (order != NULL && array_check (order, 3) == FAILURE)
> return FAILURE;
>
> + if (pad == NULL
> + && shape->expr_type == EXPR_ARRAY
> + && gfc_is_constant_expr (shape)
> + && !(source->expr_type == EXPR_VARIABLE
> + && source->symtree->n.sym->as
> + && source->symtree->n.sym->as->type == AS_ASSUMED_SIZE))
> + {
> + /* Check the match in size between source and destination. */
> + if (gfc_array_size (source, &nelems) == SUCCESS)
> + {
> + gfc_constructor *c;
> + bool test;
> +
> + c = shape->value.constructor;
> + mpz_init_set_ui (size, 1);
> + for (; c; c = c->next)
> + mpz_mul (size, size, c->expr->value.integer);
> +
> + test = mpz_cmp (nelems, size) < 0 && mpz_cmp_ui (size, 0) > 0;
> + mpz_clear (nelems);
> + mpz_clear (size);
> +
> + if (test)
> + {
> + gfc_error ("Without padding, there are not enough elements in the "
> + "intrinsic RESHAPE source at %L to match the shape",
> + &source->where);
> + return FAILURE;
> + }
> + }
> + }
> +
> return SUCCESS;
> }
>
> Index: gcc/testsuite/gfortran.dg/reshape_source_size_1.f90
> ===================================================================
> *** gcc/testsuite/gfortran.dg/reshape_source_size_1.f90 (revision 0)
> --- gcc/testsuite/gfortran.dg/reshape_source_size_1.f90 (revision 0)
> ***************
> *** 0 ****
> --- 1,11 ----
> + ! { dg-do compile }
> + ! Tests patch for PR29758, which arose from PR29431. There was no check that there
> + ! were enough elements in the source to match the shape.
> + !
> + ! Contributed by Paul Thomas <pault@gcc.gnu.org>
> + !
> + real :: a(2,2), b = 1.0, c(3), d(4)
> + a = reshape ([b], [2,2]) ! { dg-error "not enough elements" }
> + a = reshape (c, [2,2]) ! { dg-error "not enough elements" }
> + a = reshape (d, [2,2])
> + end
>
More information about the Gcc-patches
mailing list