From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 79679 invoked by alias); 17 May 2017 09:57:21 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 79163 invoked by uid 89); 17 May 2017 09:57:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=52618 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 17 May 2017 09:57:19 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 488AB8535D; Wed, 17 May 2017 09:57:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 488AB8535D Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=polacek@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 488AB8535D Received: from redhat.com (ovpn-204-170.brq.redhat.com [10.40.204.170]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v4H9v9QU026749 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 17 May 2017 05:57:13 -0400 Date: Wed, 17 May 2017 10:48:00 -0000 From: Marek Polacek To: Richard Biener Cc: GCC Patches , Jakub Jelinek , Martin =?utf-8?B?TGnFoWth?= Subject: Re: C PATCH to fix ASAN ICE with a compound literal (PR sanitizer/80659) Message-ID: <20170517095709.GG24582@redhat.com> References: <20170516134051.GE24582@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.8.0 (2017-02-23) X-SW-Source: 2017-05/txt/msg01361.txt.bz2 On Wed, May 17, 2017 at 09:42:08AM +0200, Richard Biener wrote: > On Tue, 16 May 2017, Marek Polacek wrote: > > > Martin L. asked me to have a look at this ICE with ASAN. This is an ICE with a > > compound literal in a switch. A hash map gimplify_ctxp->live_switch_vars is > > filled when processing DECL_EXPRs with their DECL_EXPR_DECLs. Such decls should > > then be removed from the hash map when gimplifying a BIND_EXPR. > > > > In C, non-static compound literals aren't pushed into any scope, so they were > > never found by gimplify_bind_expr, so they stayed in the hash map resulting in > > a crash on > > 2299 if (gimplify_ctxp->live_switch_vars) > > 2300 { > > 2301 gcc_assert (gimplify_ctxp->live_switch_vars->elements () == 0); > > 2302 delete gimplify_ctxp->live_switch_vars; > > 2303 } > > > > We don't add artificial decls to the hash map: > > 1647 if (!DECL_ARTIFICIAL (decl) && gimplify_ctxp->live_switch_vars) > > 1648 gimplify_ctxp->live_switch_vars->add (decl); > > > > build_compound_literal only marks a decl of a compound literal as artificial > > when the compound literal is static. I think there's no harm in marking > > decls of non-static compound literals as artificial, too (provided it's fine to > > skip asan instrumentation of compound literals). > > But probably DECL_IGNORED_P as well at the same time? Good point. > > Bootstrapped/regtested on x86_64-linux, ok for trunk? > > Ok with moving that as well (and re-testing). Thus applying: Bootstrapped/regtested on x86_64-linux. 2017-05-17 Marek Polacek PR sanitizer/80659 * c-decl.c (build_compound_literal): Set DECL_ARTIFICIAL and DECL_IGNORED_P even for non-static compound literals. * gcc.dg/asan/pr80659.c: New test. diff --git gcc/c/c-decl.c gcc/c/c-decl.c index b779d37..74186da 100644 --- gcc/c/c-decl.c +++ gcc/c/c-decl.c @@ -5261,6 +5261,8 @@ build_compound_literal (location_t loc, tree type, tree init, bool non_const) DECL_CONTEXT (decl) = current_function_decl; TREE_USED (decl) = 1; DECL_READ_P (decl) = 1; + DECL_ARTIFICIAL (decl) = 1; + DECL_IGNORED_P (decl) = 1; TREE_TYPE (decl) = type; TREE_READONLY (decl) = (TYPE_READONLY (type) || (TREE_CODE (type) == ARRAY_TYPE @@ -5297,8 +5299,6 @@ build_compound_literal (location_t loc, tree type, tree init, bool non_const) set_compound_literal_name (decl); DECL_DEFER_OUTPUT (decl) = 1; DECL_COMDAT (decl) = 1; - DECL_ARTIFICIAL (decl) = 1; - DECL_IGNORED_P (decl) = 1; pushdecl (decl); rest_of_decl_compilation (decl, 1, 0); } diff --git gcc/testsuite/gcc.dg/asan/pr80659.c gcc/testsuite/gcc.dg/asan/pr80659.c index e69de29..0cbf2e4 100644 --- gcc/testsuite/gcc.dg/asan/pr80659.c +++ gcc/testsuite/gcc.dg/asan/pr80659.c @@ -0,0 +1,13 @@ +/* PR sanitizer/80659 */ +/* { dg-do compile } */ + +void +foo (int a) +{ + switch (a) + { + case 0: + (int[3]) { }; + int h; + } +} Marek