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 2C0273858C78 for ; Tue, 1 Mar 2022 20:03:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2C0273858C78 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (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 DAFC31F37E; Tue, 1 Mar 2022 20:03:39 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (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 imap2.suse-dmz.suse.de (Postfix) with ESMTPS id C723F13B96; Tue, 1 Mar 2022 20:03:39 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id k3weMBt8HmKMcQAAMHmgww (envelope-from ); Tue, 01 Mar 2022 20:03:39 +0000 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable From: Richard Biener Mime-Version: 1.0 (1.0) Subject: Re: [PATCH] warn-access: Fix up check_pointer_uses [PR104715] Date: Tue, 1 Mar 2022 21:03:38 +0100 Message-Id: References: <2f312e75-772b-e8b6-ecbe-01daff873526@gmail.com> Cc: Jakub Jelinek , Jeff Law In-Reply-To: <2f312e75-772b-e8b6-ecbe-01daff873526@gmail.com> To: Martin Sebor via Gcc-patches X-Mailer: iPhone Mail (19D52) X-Spam-Status: No, score=-5.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE 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-List-Received-Date: Tue, 01 Mar 2022 20:03:42 -0000 > Am 01.03.2022 um 20:08 schrieb Martin Sebor via Gcc-patches : >=20 > =EF=BB=BFOn 3/1/22 11:41, Jakub Jelinek wrote: >> Hi! >> The following testcase emits bogus -Wdangling-pointer warnings. >> The bug is that when it sees that ptr immediate use is a call that >> returns one of its arguments, it will assume that the return value >> is based on ptr, but that is the case only if ptr is passed to the >> argument that is actually returned (so e.g. for memcpy the first argument= , >> etc.). When the builtins guarantee e.g. that the result is based on the >> first argument (either ERF_RETURNS_ARG 0 in which case it will always >> just returns the first argument as is, or when it is something like >> strstr or strpbrk or mempcpy that it returns some pointer based on the >> first argument), it means the result is not based on second or following >> argument if any. The second hunk fixes this. >> The first hunk just removes an unnecessary TREE_CODE check, the code only= >> pushes SSA_NAMEs into the pointers vector and if it didn't, it uses >> FOR_EACH_IMM_USE_FAST (use_p, iter, ptr) >> a few lines below this, which of course requires that ptr is a SSA_NAME. >> Tree checking on SSA_NAME_VERSION will already ensure that if it wasn't >> a SSA_NAME, we'd ICE. >> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? Ok Richard=20 > Thanks for the fix. It makes sense to me. Besides the test for > the false positives I would suggest to add one to verify that using > the first argument to a strstr() call is diagnosed if it's dangling > (both as is, as well as with an offset from the first element). > There are tests for memchr and strchr in the -Wdangling-pointer > test suite but none for strstr. >=20 > Martin >=20 >> 2022-03-01 Jakub Jelinek >> PR tree-optimization/104715 >> * gimple-ssa-warn-access.cc (pass_waccess::check_pointer_uses): Don't >> unnecessarily test if ptr is a SSA_NAME, it has to be. Only push lhs >> of a call if gimple_call_return_arg is equal to ptr, not just when it >> is non-NULL. >> * c-c++-common/Wdangling-pointer-7.c: New test. >> --- gcc/gimple-ssa-warn-access.cc.jj 2022-02-28 16:22:40.860520930 +01= 00 >> +++ gcc/gimple-ssa-warn-access.cc 2022-02-28 16:55:01.242272499 +0100 >> @@ -4169,8 +4169,7 @@ pass_waccess::check_pointer_uses (gimple >> for (unsigned i =3D 0; i !=3D pointers.length (); ++i) >> { >> tree ptr =3D pointers[i]; >> - if (TREE_CODE (ptr) =3D=3D SSA_NAME >> - && !bitmap_set_bit (visited, SSA_NAME_VERSION (ptr))) >> + if (!bitmap_set_bit (visited, SSA_NAME_VERSION (ptr))) >> /* Avoid revisiting the same pointer. */ >> continue; >> @@ -4267,7 +4266,7 @@ pass_waccess::check_pointer_uses (gimple >> if (gcall *call =3D dyn_cast (use_stmt)) >> { >> - if (gimple_call_return_arg (call)) >> + if (gimple_call_return_arg (call) =3D=3D ptr) >> if (tree lhs =3D gimple_call_lhs (call)) >> if (TREE_CODE (lhs) =3D=3D SSA_NAME) >> pointers.safe_push (lhs); >> --- gcc/testsuite/c-c++-common/Wdangling-pointer-7.c.jj 2022-02-28 17:= 09:09.906355082 +0100 >> +++ gcc/testsuite/c-c++-common/Wdangling-pointer-7.c 2022-02-28 17:03:= 50.533839892 +0100 >> @@ -0,0 +1,36 @@ >> +/* PR tree-optimization/104715 */ >> +/* { dg-do compile } */ >> +/* { dg-options "-Wdangling-pointer" } */ >> + >> +char * >> +foo (char *p) >> +{ >> + { >> + char q[61] =3D "0123456789012345678901234567890123456789012345678901= 23456789"; >> + char *r =3D q; >> + p =3D __builtin_strcat (p, r); >> + } >> + return p; /* { dg-bogus "using dangling pointer" } */ >> +} >> + >> +char * >> +bar (char *p) >> +{ >> + { >> + char q[] =3D "0123456789"; >> + char *r =3D q; >> + p =3D __builtin_strstr (p, r); >> + } >> + return p; /* { dg-bogus "using dangling pointer" } */ >> +} >> + >> +char * >> +baz (char *p) >> +{ >> + { >> + char q[] =3D "0123456789"; >> + char *r =3D q; >> + p =3D __builtin_strpbrk (p, r); >> + } >> + return p; /* { dg-bogus "using dangling pointer" } */ >> +} >> Jakub >=20