public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Martin Sebor <msebor@gmail.com>
To: Richard Biener <richard.guenther@gmail.com>, Jeff Law <law@redhat.com>
Cc: GCC Patches <gcc-patches@gcc.gnu.org>
Subject: [PING #2] [PATCH] look harder for MEM_REF operand equality to avoid -Wstringop-truncation (PR 84561)
Date: Mon, 08 Oct 2018 22:03:00 -0000	[thread overview]
Message-ID: <6034b402-e7f6-530e-6f0f-da1060ea165f@gmail.com> (raw)
In-Reply-To: <6ea88a1b-849f-a781-6963-72cc205e433f@gmail.com>

Ping: https://gcc.gnu.org/ml/gcc-patches/2018-08/msg01934.html

On 10/01/2018 03:30 PM, Martin Sebor wrote:
> Ping: https://gcc.gnu.org/ml/gcc-patches/2018-08/msg01934.html
>
> We have discussed a number of different approaches to moving
> the warning somewhere else but none is feasible in the limited
> amount of time remaining in stage 1 of GCC 9.  I'd like to
> avoid the false positive in GCC 9 by using the originally
> submitted, simple approach and look into the suggested design
> changes for GCC 10.
>
> On 09/21/2018 08:36 AM, Martin Sebor wrote:
>> On 09/20/2018 03:06 AM, Richard Biener wrote:
>>> On Wed, Sep 19, 2018 at 4:19 PM Martin Sebor <msebor@gmail.com> wrote:
>>>>
>>>> On 09/18/2018 10:23 PM, Jeff Law wrote:
>>>>> On 9/18/18 1:46 PM, Martin Sebor wrote:
>>>>>> On 09/18/2018 12:58 PM, Jeff Law wrote:
>>>>>>> On 9/18/18 11:12 AM, Martin Sebor wrote:
>>>>>>>
>>>>>>>>> My bad.  Sigh. CCP doesn't track copies, just constants, so
>>>>>>>>> there's not
>>>>>>>>> going to be any data structure you can exploit.  And I don't think
>>>>>>>>> there's a value number you can use to determine the two objects
>>>>>>>>> are the
>>>>>>>>> same.
>>>>>>>>>
>>>>>>>>> Hmm, let's back up a bit, what is does the relevant part of the
>>>>>>>>> IL look
>>>>>>>>> like before CCP?  Is the real problem here that we have
>>>>>>>>> unpropagated
>>>>>>>>> copies lying around in the IL?  Hmm, more likely the IL looksl
>>>>>>>>> ike:
>>>>>>>>>
>>>>>>>>>    _8 = &pb_3(D)->a;
>>>>>>>>>    _9 = _8;
>>>>>>>>>    _1 = _9;
>>>>>>>>>    strncpy (MEM_REF (&pb_3(D)->a), ...);
>>>>>>>>>    MEM[(struct S *)_1].a[n_7] = 0;
>>>>>>>>
>>>>>>>> Yes, that is what the folder sees while the strncpy call is
>>>>>>>> being transformed/folded by ccp.  The MEM_REF is folded just
>>>>>>>> after the strncpy call and that's when it's transformed into
>>>>>>>>
>>>>>>>>   MEM[(struct S *)_8].a[n_7] = 0;
>>>>>>>>
>>>>>>>> (The assignments to _1 and _9 don't get removed until after
>>>>>>>> the dom walk finishes).
>>>>>>>>
>>>>>>>>>
>>>>>>>>> If we were to propagate the copies out we'd at best have:
>>>>>>>>>
>>>>>>>>>    _8 = &pb_3(D)->a;
>>>>>>>>>    strncpy (MEM_REF (&pb_3(D)->a), ...);
>>>>>>>>>    MEM[(struct S *)_8].a[n_7] = 0;
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Is that in a form you can handle?  Or would we also need to
>>>>>>>>> forward
>>>>>>>>> propagate the address computation into the use of _8?
>>>>>>>>
>>>>>>>> The above works as long as we look at the def_stmt of _8 in
>>>>>>>> the MEM_REF (we currently don't).  That's also what the last
>>>>>>>> iteration of the loop does.  In this case (with _8) it would
>>>>>>>> be discovered in the first iteration, so the loop could be
>>>>>>>> replaced by a simple if statement.
>>>>>>>>
>>>>>>>> But I'm not sure I understand the concern with the loop.  Is
>>>>>>>> it that we are looping at all, i.e., the cost?  Or that ccp
>>>>>>>> is doing something wrong or suboptimal? (Should have
>>>>>>>> propagated the value of _8 earlier?)
>>>>>>> I suspect it's more a concern that things like copies are typically
>>>>>>> propagated away.   So their existence in the IL (and consequently
>>>>>>> your
>>>>>>> need to handle them) raises the question "has something else
>>>>>>> failed to
>>>>>>> do its job earlier".
>>>>>>>
>>>>>>> During which of the CCP passes is this happening?  Can we pull the
>>>>>>> warning out of the folder (even if that means having a distinct
>>>>>>> warning
>>>>>>> pass over the IL?)
>>>>>>
>>>>>> It happens during the third run of the pass.
>>>>>>
>>>>>> The only way to do what you suggest that I could think of is
>>>>>> to defer the strncpy to memcpy transformation until after
>>>>>> the warning pass.  That was also my earlier suggestion: defer
>>>>>> both it and the warning until the tree-ssa-strlen pass (where
>>>>>> the warning is implemented to begin with -- the folder calls
>>>>>> into it).
>>>>> If it's happening that late (CCP3) in general, then ISTM we ought
>>>>> to be
>>>>> able to get the warning out of the folder.  We just have to pick the
>>>>> right spot.
>>>>>
>>>>> warn_restrict runs before fold_all_builtins, but after dom/vrp so we
>>>>> should have the IL in pretty good shape.  That seems like about the
>>>>> right time.
>>>>>
>>>>> I wonder if we could generalize warn_restrict to be a more generic
>>>>> warning pass over the IL and place it right before fold_builtins.
>>>>
>>>> The restrict pass doesn't know about string lengths so it can't
>>>> handle all the warnings about string built-ins (the strlen pass
>>>> now calls into it to issue some).  The strlen pass does so it
>>>> could handle most if not all of them (the folder also calls
>>>> into it to issue some warnings).  It would work even better if
>>>> it were also integrated with the object size pass.
>>>>
>>>> We're already working on merging strlen with sprintf.  It seems
>>>> to me that the strlen pass would benefit not only from that but
>>>> also from integrating with object size and warn-restrict.  With
>>>> that, -Wstringop-overflow could be moved from builtins.c into
>>>> it as well (and also benefit not only from accurate string
>>>> lengths but also from the more accurate object size info).
>>>>
>>>> What do you think about that?
>>>
>>> I think integrating the various "passes" (objectsize is also
>>> as much a facility as a pass) generally makes sense given
>>> it might end up improving all of them and reduce code duplication.
>>
>> Okay.  If Jeff agrees I'll see if I can make it happen for GCC
>> 10.  Until then, does either of you have any suggestions for
>> a different approach in this patch or is it acceptable with
>> the loop as is?
>>
>> Martin
>>
>>>
>>> Richard.
>>>
>>>>
>>>> Martin
>>>>
>>>> PS I don't think I could do more than merger strlen and sprintf
>>>> before stage 1 ends (if even that much) so this would be a longer
>>>> term goal.
>>
>

  reply	other threads:[~2018-10-08 21:40 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-30  0:12 Martin Sebor
2018-08-30  8:35 ` Richard Biener
2018-08-30 16:54   ` Martin Sebor
2018-08-30 17:22     ` Richard Biener
2018-08-30 17:39       ` Martin Sebor
2018-08-31 10:07         ` Richard Biener
2018-09-12 18:03           ` Martin Sebor
2018-09-14 21:35             ` Jeff Law
2018-09-14 23:44               ` Martin Sebor
2018-09-17 23:13                 ` Jeff Law
2018-09-18 17:38                   ` Martin Sebor
2018-09-18 19:24                     ` Jeff Law
2018-09-18 20:01                       ` Martin Sebor
2018-09-19  5:40                         ` Jeff Law
2018-09-19 14:31                           ` Martin Sebor
2018-09-20  9:21                             ` Richard Biener
2018-09-21 14:50                               ` Martin Sebor
2018-10-01 21:46                                 ` [PING] " Martin Sebor
2018-10-08 22:03                                   ` Martin Sebor [this message]
2018-10-31 17:11                                     ` [PING #3] " Martin Sebor
2018-11-16  3:09                                       ` [PING #4] " Martin Sebor
2018-11-16  8:46                                         ` Richard Biener
2018-11-19 14:55                                           ` Jeff Law
2018-11-19 16:27                                           ` Martin Sebor
2018-11-20  9:23                                             ` Richard Biener
2018-10-04  3:08                             ` Jeff Law
2018-09-19 13:51                       ` Richard Biener

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6034b402-e7f6-530e-6f0f-da1060ea165f@gmail.com \
    --to=msebor@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=law@redhat.com \
    --cc=richard.guenther@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).