On Thu, Mar 5, 2020 at 12:49 AM Jeff Law <[email protected]> wrote:
>
> On Wed, 2020-03-04 at 09:22 -0700, Martin Sebor wrote:
> >
> > I don't remember why the code in -Wrestrict unconditionally overwrites
> > the statement location rather than only when it's not available, but
> > I do remember adding conditional code like in your patch in r277076
> > to deal with missing location on the statement. So either your fix
> > or something like the hunk below might be the right solution (if we
> > go with the code below, abstracting it into a utility function might
> > be nice).
> So there's several chunks that are fairly similar to what you referenced in
> maybe_warn_pointless_strcmp. Factoring all of them into a single location is
> pretty easy.
>
> That also gives us a nice place where we can experiment with "does extraction
> of
> location information from the expression ever help". The answer is, it
> doesn't,
> at least not within our testsuite when run on x86_64.
>
> I'm hesitant to remove the code that extracts the location out of the
> expression,
> but could be convinced to do so.
>
> Thoughts?
Using anything but the actual stmt location is prone to end up at random places
due to tree sharing issues, CSE and copy propagation. Simply consider
char one[50];
char two[50];
void
test_strncat (void)
{
char *p = one;
(void) __builtin_strcpy (p, "gh");
(void) __builtin_strcpy (two, "ef");
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wstringop-overflow="
#pragma GCC diagnostic ignored "-Warray-bounds"
(void) __builtin_strncat (p, two, 99);
#pragma GCC diagnostic pop
}
where we happily forward p = &one[0] to both uses injecting
a "faulty" location. Well, it's actually the correct location
computing &one[0] but irrelevant for the actual call.
So the question is why we end up with UNKNOWN_LOCATION
for such call and if why we need to bother emit a diagnostic
at all (and why emitting it for another possibly random location is a good idea
instead of maybe simply emitting it without location).
Richard.
> Jeff