From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by sourceware.org (Postfix) with ESMTPS id 1B12A3852C64 for ; Wed, 7 Dec 2022 11:25:03 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 1B12A3852C64 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id B14861FD92; Wed, 7 Dec 2022 11:25:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1670412301; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type; bh=Id3SLAwxRnRXQQB+M0/VqZWqDUxx3nFiGSzdMSGaWMU=; b=dT+o6sQ3wXhTi0CqqqRHCBYHeujn52qgJ4jeFpV8waCZLmxV60RATjva28SFn83v6ROKP4 p7JuCimx/4VULWOdfYOpVgWvfz5k1P/M2We3VQVl7+vOvNtawweOj1sp876kb5xjNcJ1D2 BnKCG2gCkXp5AWNS1BgVodhP3W55YmM= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1670412301; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type; bh=Id3SLAwxRnRXQQB+M0/VqZWqDUxx3nFiGSzdMSGaWMU=; b=wOgJd3JICg4VpUdwd+RzWQIVgsdTRY5XAat3D6P5tu0nG1Wy5l5PCCM9ixP2GKFDLUQMWS HxUJAWT+5fZqFmCg== Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap1.suse-dmz.suse.de (Postfix) with ESMTPS id 989ED136B4; Wed, 7 Dec 2022 11:25:01 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap1.suse-dmz.suse.de with ESMTPSA id RSYsJA14kGPxKgAAGKfGzw (envelope-from ); Wed, 07 Dec 2022 11:25:01 +0000 Date: Wed, 7 Dec 2022 12:25:01 +0100 (CET) From: Richard Biener To: gcc-patches@gcc.gnu.org cc: jason@redhat.com, Jakub Jelinek Subject: [PATCH] tree-optimization/104475 - bogus -Wstringop-overflow MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Message-Id: <20221207112501.989ED136B4@imap1.suse-dmz.suse.de> X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,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: The following avoids a bogus -Wstringop-overflow diagnostic by properly recognizing that &d->m_mutex cannot be nullptr in C++ even if m_mutex is at offset zero. The frontend already diagnoses a &d->m_mutex != nullptr comparison and the following transfers this knowledge to the middle-end which sees &d->m_mutex as simple pointer arithmetic. The new ADDR_NONZERO flag on an ADDR_EXPR is used to carry this information and it's checked in the tree_expr_nonzero_p API which causes this to be folded early. To avoid the bogus diagnostic this avoids separating the nullptr path via jump-threading by eliminating the nullptr check. I'd appreciate C++ folks picking this up and put the flag on the appropriate ADDR_EXPRs - I've tried avoiding to put it on all of them and didn't try hard to mimick what -Waddress warns on (the code is big, maybe some refactoring would help but also not sure what exactly the C++ standard constraints are here). Bootstrapped and tested on x86_64-unknown-linux-gnu. Thanks, Richard. PR tree-optimization/104475 gcc/ * tree-core.h: Document use of nothrow_flag on ADDR_EXPR. * tree.h (ADDR_NONZERO): New. * fold-const.cc (tree_single_nonzero_warnv_p): Check ADDR_NONZERO. gcc/cp/ * typeck.cc (cp_build_addr_expr_1): Set ADDR_NONZERO on the built address if it is of a COMPONENT_REF. * g++.dg/opt/pr104475.C: New testcase. --- gcc/cp/typeck.cc | 3 +++ gcc/fold-const.cc | 4 +++- gcc/testsuite/g++.dg/opt/pr104475.C | 12 ++++++++++++ gcc/tree-core.h | 3 +++ gcc/tree.h | 4 ++++ 5 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/opt/pr104475.C diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc index 7dfe5acc67e..3563750803e 100644 --- a/gcc/cp/typeck.cc +++ b/gcc/cp/typeck.cc @@ -7232,6 +7232,9 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain) gcc_assert (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (object), decl_type_context (field))); val = build_address (arg); + if (TREE_CODE (val) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (val, 0)) == COMPONENT_REF) + ADDR_NONZERO (val) = 1; } if (TYPE_PTR_P (argtype) diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc index e80be8049e1..cdfe3f50ae3 100644 --- a/gcc/fold-const.cc +++ b/gcc/fold-const.cc @@ -15308,8 +15308,10 @@ tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p) case ADDR_EXPR: { - tree base = TREE_OPERAND (t, 0); + if (ADDR_NONZERO (t)) + return true; + tree base = TREE_OPERAND (t, 0); if (!DECL_P (base)) base = get_base_address (base); diff --git a/gcc/testsuite/g++.dg/opt/pr104475.C b/gcc/testsuite/g++.dg/opt/pr104475.C new file mode 100644 index 00000000000..013c70302c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr104475.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// { dg-require-effective-target c++11 } +// { dg-options "-O -Waddress -fdump-tree-original" } + +struct X { int i; }; + +bool foo (struct X *p) +{ + return &p->i != nullptr; /* { dg-warning "never be NULL" } */ +} + +/* { dg-final { scan-tree-dump "return = 1;" "original" } } */ diff --git a/gcc/tree-core.h b/gcc/tree-core.h index e146b133dbd..303e25b5df6 100644 --- a/gcc/tree-core.h +++ b/gcc/tree-core.h @@ -1376,6 +1376,9 @@ struct GTY(()) tree_base { TREE_THIS_NOTRAP in INDIRECT_REF, MEM_REF, TARGET_MEM_REF, ARRAY_REF, ARRAY_RANGE_REF + ADDR_NONZERO in + ADDR_EXPR + SSA_NAME_IN_FREE_LIST in SSA_NAME diff --git a/gcc/tree.h b/gcc/tree.h index 23223ca0c87..1c810c0b21b 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -876,6 +876,10 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, (TREE_CHECK5 (NODE, INDIRECT_REF, MEM_REF, TARGET_MEM_REF, ARRAY_REF, \ ARRAY_RANGE_REF)->base.nothrow_flag) +/* Nozero means this ADDR_EXPR is not equal to NULL. */ +#define ADDR_NONZERO(NODE) \ + (TREE_CHECK (NODE, ADDR_EXPR)->base.nothrow_flag) + /* In a VAR_DECL, PARM_DECL or FIELD_DECL, or any kind of ..._REF node, nonzero means it may not be the lhs of an assignment. Nonzero in a FUNCTION_DECL means this function should be treated -- 2.35.3