From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2071) id 2FD073858D28; Wed, 15 Dec 2021 19:35:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2FD073858D28 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Harald Anlauf To: gcc-cvs@gcc.gnu.org Subject: [gcc r11-9385] Fortran: prevent NULL pointer dereferences checking do-loop contained stuff X-Act-Checkin: gcc X-Git-Author: Harald Anlauf X-Git-Refname: refs/heads/releases/gcc-11 X-Git-Oldrev: 4636d61e9ad2a57a9c072e60f9d30429e83c2f4e X-Git-Newrev: 689f8fed9b2a250e6cbeeec4fa882b8afd34eec8 Message-Id: <20211215193504.2FD073858D28@sourceware.org> Date: Wed, 15 Dec 2021 19:35:04 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 15 Dec 2021 19:35:04 -0000 https://gcc.gnu.org/g:689f8fed9b2a250e6cbeeec4fa882b8afd34eec8 commit r11-9385-g689f8fed9b2a250e6cbeeec4fa882b8afd34eec8 Author: Harald Anlauf Date: Tue Dec 14 21:02:04 2021 +0100 Fortran: prevent NULL pointer dereferences checking do-loop contained stuff gcc/fortran/ChangeLog: PR fortran/103718 PR fortran/103719 * frontend-passes.c (doloop_contained_procedure_code): Add several checks to prevent NULL pointer dereferences on valid and invalid code called within do-loops. gcc/testsuite/ChangeLog: PR fortran/103718 PR fortran/103719 * gfortran.dg/do_check_18.f90: New test. (cherry picked from commit e866e1c92ecf88feeeafd5d55348451c9a181f3c) Diff: --- gcc/fortran/frontend-passes.c | 17 ++++++++++------- gcc/testsuite/gfortran.dg/do_check_18.f90 | 27 +++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 287b7d70876..10fa0ff3707 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -2390,7 +2390,7 @@ doloop_contained_procedure_code (gfc_code **c, switch (co->op) { case EXEC_ASSIGN: - if (co->expr1->symtree->n.sym == do_var) + if (co->expr1->symtree && co->expr1->symtree->n.sym == do_var) gfc_error_now (errmsg, do_var->name, &co->loc, info->procedure->name, &info->where_do); break; @@ -2411,14 +2411,14 @@ doloop_contained_procedure_code (gfc_code **c, break; case EXEC_OPEN: - if (co->ext.open->iostat + if (co->ext.open && co->ext.open->iostat && co->ext.open->iostat->symtree->n.sym == do_var) gfc_error_now (errmsg, do_var->name, &co->ext.open->iostat->where, info->procedure->name, &info->where_do); break; case EXEC_CLOSE: - if (co->ext.close->iostat + if (co->ext.close && co->ext.close->iostat && co->ext.close->iostat->symtree->n.sym == do_var) gfc_error_now (errmsg, do_var->name, &co->ext.close->iostat->where, info->procedure->name, &info->where_do); @@ -2429,7 +2429,8 @@ doloop_contained_procedure_code (gfc_code **c, { case EXEC_INQUIRE: -#define CHECK_INQ(a) do { if (co->ext.inquire->a && \ +#define CHECK_INQ(a) do { if (co->ext.inquire && \ + co->ext.inquire->a && \ co->ext.inquire->a->symtree->n.sym == do_var) \ gfc_error_now (errmsg, do_var->name, \ &co->ext.inquire->a->where, \ @@ -2448,21 +2449,23 @@ doloop_contained_procedure_code (gfc_code **c, #undef CHECK_INQ case EXEC_READ: - if (co->expr1 && co->expr1->symtree->n.sym == do_var) + if (co->expr1 && co->expr1->symtree + && co->expr1->symtree->n.sym == do_var) gfc_error_now (errmsg, do_var->name, &co->expr1->where, info->procedure->name, &info->where_do); /* Fallthrough. */ case EXEC_WRITE: - if (co->ext.dt->iostat + if (co->ext.dt && co->ext.dt->iostat && co->ext.dt->iostat->symtree && co->ext.dt->iostat->symtree->n.sym == do_var) gfc_error_now (errmsg, do_var->name, &co->ext.dt->iostat->where, info->procedure->name, &info->where_do); break; case EXEC_IOLENGTH: - if (co->expr1 && co->expr1->symtree->n.sym == do_var) + if (co->expr1 && co->expr1->symtree + && co->expr1->symtree->n.sym == do_var) gfc_error_now (errmsg, do_var->name, &co->expr1->where, info->procedure->name, &info->where_do); break; diff --git a/gcc/testsuite/gfortran.dg/do_check_18.f90 b/gcc/testsuite/gfortran.dg/do_check_18.f90 new file mode 100644 index 00000000000..b06112aa68f --- /dev/null +++ b/gcc/testsuite/gfortran.dg/do_check_18.f90 @@ -0,0 +1,27 @@ +! { dg-do compile } +! PR103718, +! PR103719 - ICE in doloop_contained_procedure_code +! Contributed by G.Steinmetz + +subroutine s1 + integer :: i + do i = 1, 2 + call s + end do +contains + subroutine s + integer :: n + inquire (iolength=n) 0 ! valid + end +end + +subroutine s2 + integer :: i + do i = 1, 2 + call s + end do +contains + subroutine s + shape(1) = 0 ! { dg-error "Non-variable expression" } + end +end