From patchwork Tue Dec 14 20:08:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harald Anlauf X-Patchwork-Id: 48915 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 51D02385AC3B for ; Tue, 14 Dec 2021 20:09:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 51D02385AC3B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1639512556; bh=1+8X9E70UBUpf4GDgqSWUxzyJyRzYJwYhujplHWXRBU=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=xqnJrx+spJ/Uwekk8gcnjgffu+iIQipRG0adXE3lUXj674BtFigyedSsgKWMMWijT +jBNGphB6PKaunb+2uXmd14Aa8dwiQ+Mi7B6Ot4kyEzsM0z9pfxM2QEA9A5Ng5nc3p iDDBXVj63/TImLrhY/5BEyPyjn1t4C7EFIoHaxHU= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) by sourceware.org (Postfix) with ESMTPS id 5FD9A3858412; Tue, 14 Dec 2021 20:08:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5FD9A3858412 X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [79.251.12.246] ([79.251.12.246]) by web-mail.gmx.net (3c-app-gmx-bs57.server.lan [172.19.170.141]) (via HTTP); Tue, 14 Dec 2021 21:08:27 +0100 MIME-Version: 1.0 Message-ID: To: fortran , gcc-patches Subject: [PATCH] PR fortran/103718 & PR fortran/103719 - [11/12 Regression] ICE in doloop_contained_procedure_code Date: Tue, 14 Dec 2021 21:08:27 +0100 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:sd8HAt2khDO7KRpUStPb+gfVeNBquA4V7Lk9EhXLcEvUfvrsYWfGgFp0r1nG8XkSTJOR1 /GSNHwJfy4R5jDzSHc8waYY1CmfH7xRFGtj3FbmxBRnk7AavcRYYbzhH4oS5CYADgfrGQnZ9lTYQ E9ZBOH+1FQ6lWrK6Hv8sLrtjlLrBEjGnG2zBe0qXi+cAgXJ04KN0/1OAu/+rCqdJNJgZjstkvPMG ecYe71c/e0o7/hdUfZG4HLCGutSENTD7318eWrwMvactOQrZq6D4nn9avllbQ68+li7YbPI7CUT+ Bc= X-UI-Out-Filterresults: notjunk:1;V03:K0:sI8h+OrXwPo=:38QOyjEX9dzC6dMolS2hhc 1crEmSvpU6Q/dOxuEogXQfLtQmPYaLJU+zVW7AuUEdTThc5zpOhlB1LdHtIc7q2NqEZ0RAYxZ 8I0bV/+Igud/Hp1ERUoVmbKEOly5g9CUc78GvHilutMTdy9bvw7+ipWdvEijKqFcEJiDAtT63 Jpwm+KGDHpz7a2NjjXBw6/+bq7OLPYykvLKmq6xiUA+ZGlVsHvj3GwJof8mCdf/GELkY2Bou5 nwuDy+FeCvKiSKDC0QnhzBWbInqXxhCYtxSAes1aBKRiv6Zfger0MWD/JeG5ROVitRY2Nknfl 89gx6SrPUGdynIeE3G+kiddfFPJOkp7470Qy31J6F7CY57UBE9WNSeBsDLfIlKSJMkabbyQGI TqTJUEienxJ/lXmTBhrJB/yi96REeNfW9hVh3hedxBWf9XmkwPiNJWKrCvKBqn0hyqt2+6Nf4 q0Pk3OpwNdyaZ/+aazVOgBLeWnIRraDF2na/M8QweyWSQBnzduE6SPHOj01tKGQFwFJWfnEyi TiPqKOnKgWIrTpxlj7+7givWZv2gCdMzhXk4rxMcGrnenV0jBtXPx1TYCbiQ9UyPMD7oCE92q wb5i8XqTP9DioLL+NtlBoIpnx5XG/G1OrcSDTRoVvs1DzW1FLdkLq2fer+Jyi9p7Ex0J+bz2U Oyx5Q9PLqXGHrRIs4CQ2pNNumNp1WVbaZT/FSnA5Y3tYa883SOJYac3QsFJc8Pm+CTQH0RQQK 29Yx2Pze5jkAZC0Ks/7aMDR4f6nHBuirdIvZkhlZhJK8b0tYlEGmINOJwjWLG9cg2xgCTrAic ELifC5h X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Harald Anlauf via Gcc-patches From: Harald Anlauf Reply-To: Harald Anlauf Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Dear all, there are several pretty obvious NULL pointer dereferences on valid and invalid code when checking do-loop contained stuff. Reported by Gerhard. Regtested on x86_64-pc-linux-gnu. OK for mainline/11-branch? Thanks, Harald From 89bf4b17022890b539cd4b5dbe9bd9142ff8706c Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Tue, 14 Dec 2021 21:02:04 +0100 Subject: [PATCH] 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. --- gcc/fortran/frontend-passes.c | 17 ++++++++------ gcc/testsuite/gfortran.dg/do_check_18.f90 | 27 +++++++++++++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/do_check_18.f90 diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 57b24a11cbe..c106ee0957a 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 -- 2.26.2