From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) by sourceware.org (Postfix) with ESMTPS id 9017A3858CDA; Thu, 14 Sep 2023 20:22:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9017A3858CDA Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmx.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1694722934; x=1695327734; i=anlauf@gmx.de; bh=lnU/G0HVosuV0ZN87DM3LRyFdDVnGN1jRm5vTBFAR7k=; h=X-UI-Sender-Class:From:To:Subject:Date; b=B0kbw4Sl/NRCxs9o1Uhzuhc0yVvb2a9r0Gka9OuZMbUjh+vBMlkU6Q9zhPUJWODt9QazYsRmLKh b92t5YCut0R2ZsKG2AEStw1jQuNez0VJadMLFH2/rNadRk5y5GDz2hky3PkxuvmgQ6XhN97QgfuJa LthztLkbmRl1xNpCqVrzqiYmY57fIKyM69JB/IRId9vbTexuPg5A5EmQW9YzlKcwHJUxp0COSEIH8 69OUMmc1LCyKk7WdNFe8bq22J4HUQfYlv1M6aWmId5hNVbJB3n7I8fFN2RsdiVg57d8fx6apmmc7e jWz3iPU24CuTYSOH3Xfwi1EeCX0IUFk12LGQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from [93.207.80.183] ([93.207.80.183]) by web-mail.gmx.net (3c-app-gmx-bs48.server.lan [172.19.170.101]) (via HTTP); Thu, 14 Sep 2023 22:22:14 +0200 MIME-Version: 1.0 Message-ID: From: Harald Anlauf To: fortran , gcc-patches Subject: [PATCH] Fortran: improve bounds-checking for array sections [PR30802] Content-Type: multipart/mixed; boundary=rehcsed-1ad16b89-db43-43a7-9e39-b78671db843a Date: Thu, 14 Sep 2023 22:22:14 +0200 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:Chhqvux9JnESVjVQWAXZFGhZWSLpPUYsvo27PcOIL3LJccT8r5ELGGPtMtpt6U6IwwMXb XV+/FIEBpwdx+FhkH/gUErUXGUlqRdELcO8Vfqg2IcNy0+H2a+aT+76E+d6QLe7SfjL+K79xtzzp k0sYQRHxkaQS6Ub7lj2RHMAUNLm+1ekREu1qTkbs/v5VmN7uydsykUhKd+I2QOAO91D3hzNwsFMQ FT1Y3cAKl3LbSUQxg3JXLTtBEcTQdm8fqZyIkLeJXmXu36Ur6+KKpdDoEUnegrvLhA1LdBY4dfxs hE= UI-OutboundReport: notjunk:1;M01:P0:o5U7oBPIUsw=;zsNIJ/TSwgJFtfXojqqGOjtjnuZ JAS9qfnK4uxiKgs/ddFaNncnLM/f67RyhfZqIUFvGGTSJm6kxaILQxZnry3v4VQBEgThTK8J+ HHFQsDozdCKsYebeQd2E6H8fIN/wZ5xeatOKL1ok2k0RQdw7O8HK1d3oMLwZabj06vUwav/Kj YCW5qMRWWuaKNvDtrPziDTUWt7sdFj7oWK5vgeB1BIRDF8rCA7+z/EO0DFQeCa+8ki+jLjvZn ttAMMG2Yz15s8CGkjWjNhlyoZS/QvIOV6djiQu9TLc4VlvfNqNps4SJXNMekIqsQ4pRkowaRj jctkPcc1XJbMfC2hFbmMHfbzSI7IdC4LDFJUXUOODFNOzmAQyptJsrdbWIy8jv/hsNpUk6ZPY ajgiSEH6IuxEwZcmLqwFcauh30P76DL5ue02wv2nUsG6hXMH3edK6dnQMuVaNl+sQbpQ8wGMB K+2j08iT7ukWT53h90tKjvTTBf/+wiy5TxkuzE5U1YignOgMguOs2iq7Lby3yR24NjXQZCL6q BPYrfYbtZ9rWp2I1QTJTw0gMfVgeKXOjFYUMH48j0akhifQf276xNsI7KjUdmvW1bl6L2BXbJ OmzAsEDHgPJ0PlQzQ2Ub2Xs8uww1VSpzEc2oxfw2tGjaG8CuvvWaGbdqVxFGP61Wx80amJXm/ Qwhm0eucXzoIfrrvKcXOnXeDMpMtoH58oagxklHXoMXuL7smbCljrSf1T9DxCamLqRBeIsxw6 b5DgM5SH4+Di22yqLkMkkb8LJTjce7Ui+j7pkhsfrCSOfvARUqIa5yWZESiKlQqsbDnceiM0S q91cMJwUGAtRwJRFVPj4GiYQ== X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --rehcsed-1ad16b89-db43-43a7-9e39-b78671db843a Content-Type: text/plain; charset=UTF-8 Dear all, array bounds checking was missing a few cases of array sections that are handled via gfc_conv_expr_descriptor. Bounds checking was done for the dimensions with ranges, but not for elemental dimensions. The attached patch implements that and fixes pr30802 and also pr97039, maybe a few more similar cases. Regtested on x86_64-pc-linux-gnu. OK for mainline? Thanks, Harald --rehcsed-1ad16b89-db43-43a7-9e39-b78671db843a Content-Type: text/x-patch Content-Disposition: attachment; filename=pr30802.diff Content-Transfer-Encoding: quoted-printable =46rom bb2a765f56b440c8d086329f55c8ff0eaee2b97d Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Thu, 14 Sep 2023 22:08:26 +0200 Subject: [PATCH] Fortran: improve bounds-checking for array sections [PR30= 802] gcc/fortran/ChangeLog: PR fortran/30802 * trans-array.cc (trans_array_bound_check): Add optional argument COMPNAME for explicit specification of array component name. (array_bound_check_elemental): Helper function for generating bounds-checking code for elemental dimensions. (gfc_conv_expr_descriptor): Use bounds-checking also for elemental dimensions, i.e. those not handled by the scalarizer. gcc/testsuite/ChangeLog: PR fortran/30802 * gfortran.dg/bounds_check_fail_6.f90: New test. =2D-- gcc/fortran/trans-array.cc | 72 ++++++++++++++++++- .../gfortran.dg/bounds_check_fail_6.f90 | 29 ++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/bounds_check_fail_6.f90 diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 6ca58e98547..71123e37477 100644 =2D-- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -3452,7 +3452,8 @@ gfc_conv_array_ubound (tree descriptor, int dim) static tree trans_array_bound_check (gfc_se * se, gfc_ss *ss, tree index, int n, - locus * where, bool check_upper) + locus * where, bool check_upper, + const char *compname =3D NULL) { tree fault; tree tmp_lo, tmp_up; @@ -3474,6 +3475,10 @@ trans_array_bound_check (gfc_se * se, gfc_ss *ss, t= ree index, int n, if (VAR_P (descriptor)) name =3D IDENTIFIER_POINTER (DECL_NAME (descriptor)); + /* Use given (array component) name. */ + if (compname) + name =3D compname; + /* If upper bound is present, include both bounds in the error message.= */ if (check_upper) { @@ -3524,6 +3529,67 @@ trans_array_bound_check (gfc_se * se, gfc_ss *ss, t= ree index, int n, } +/* Generate code for bounds checking for elemental dimensions. */ + +static void +array_bound_check_elemental (gfc_se * se, gfc_ss * ss, gfc_expr * expr) +{ + gfc_array_ref *ar; + gfc_ref *ref; + gfc_symbol *sym; + char *var_name =3D NULL; + size_t len; + int dim; + + if (!(gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)) + return; + + if (expr->expr_type =3D=3D EXPR_VARIABLE) + { + sym =3D expr->symtree->n.sym; + len =3D strlen (sym->name) + 1; + + for (ref =3D expr->ref; ref; ref =3D ref->next) + if (ref->type =3D=3D REF_COMPONENT) + len +=3D 2 + strlen (ref->u.c.component->name); + + var_name =3D XALLOCAVEC (char, len); + strcpy (var_name, sym->name); + + for (ref =3D expr->ref; ref; ref =3D ref->next) + { + /* Append component name. */ + if (ref->type =3D=3D REF_COMPONENT) + { + strcat (var_name, "%%"); + strcat (var_name, ref->u.c.component->name); + continue; + } + + if (ref->type =3D=3D REF_ARRAY && ref->u.ar.dimen > 0) + { + ar =3D &ref->u.ar; + for (dim =3D 0; dim < ar->dimen; dim++) + { + if (ar->dimen_type[dim] =3D=3D DIMEN_ELEMENT) + { + gfc_se indexse; + gfc_init_se (&indexse, NULL); + gfc_conv_expr_type (&indexse, ar->start[dim], + gfc_array_index_type); + trans_array_bound_check (se, ss, indexse.expr, dim, + &ar->where, + ar->as->type !=3D AS_ASSUMED_SIZE + || dim < ar->dimen - 1, + var_name); + } + } + } + } + } +} + + /* Return the offset for an index. Performs bound checking for elemental dimensions. Single element references are processed separately. DIM is the array dimension, I is the loop dimension. */ @@ -7823,6 +7889,10 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *exp= r) /* Setup the scalarizing loops and bounds. */ gfc_conv_ss_startstride (&loop); + /* Add bounds-checking for elemental dimensions. */ + if ((gfc_option.rtcheck & GFC_RTCHECK_BOUNDS) && !expr->no_bounds_check= ) + array_bound_check_elemental (se, ss, expr); + if (need_tmp) { if (expr->ts.type =3D=3D BT_CHARACTER diff --git a/gcc/testsuite/gfortran.dg/bounds_check_fail_6.f90 b/gcc/tests= uite/gfortran.dg/bounds_check_fail_6.f90 new file mode 100644 index 00000000000..90329131158 =2D-- /dev/null +++ b/gcc/testsuite/gfortran.dg/bounds_check_fail_6.f90 @@ -0,0 +1,29 @@ +! { dg-do run } +! { dg-additional-options "-fcheck=3Dbounds -g -fdump-tree-original" } +! { dg-output "At line 18 .*" } +! { dg-shouldfail "dimension 3 of array 'u%z' outside of expected range" = } +! +! PR fortran/30802 - improve bounds-checking for array sections + +program test + implicit none + integer :: k =3D 0 + integer, dimension(10,20,30) :: x =3D 42 + type t + real, dimension(10,20,30) :: z =3D 23 + end type t + type(t) :: u + + ! pr30802 + print *, u% z(1,:,k) ! runtime check only for dimension 3 + + ! pr97039 + call foo (x(k,:,k+1)) ! runtime checks for dimensions 1,3 +contains + subroutine foo (a) + integer, intent(in) :: a(:) + end subroutine foo +end program test + +! { dg-final { scan-tree-dump-times "'u%%z.' outside of expected range" 2= "original" } } +! { dg-final { scan-tree-dump-times "'x.' outside of expected range" 4 "o= riginal" } } =2D- 2.35.3 --rehcsed-1ad16b89-db43-43a7-9e39-b78671db843a--