https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119611

            Bug ID: 119611
           Summary: Function call substitution cause confusing warning
                    messages
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: siddhesh at gcc dot gnu.org
  Target Milestone: ---

Consider the following:

```
#include <string.h>
void f (void*);

void h (void)
{
  char a[8];
  stpcpy (stpcpy (a, "12345678"), "abcdefgh");
  f (a);
}

$ gcc -D_FORTIFY_SOURCE=2 -O2 -S f.c 
f.c: In function ‘h’:
f.c:7:3: warning: ‘__builtin___stpcpy_chk’ writing 9 bytes into a region of
size 8 [-Wstringop-overflow=]
    7 |   stpcpy (stpcpy (a, "12345678"), "abcdefgh");
      |   ^
f.c:6:8: note: destination object ‘a’ of size 8
    6 |   char a[8];
      |        ^
f.c:7:3: warning: ‘__builtin_memcpy’ writing 9 bytes into a region of size 8
[-Wstringop-overflow=]
    7 |   stpcpy (stpcpy (a, "12345678"), "abcdefgh");
      |   ^
f.c:6:8: note: at offset [0, 7] into destination object ‘a’ of size 8
    6 |   char a[8];
      |        ^
```

Here, instead of referring to stpcpy (or its _chk variant), the warning refers
to __builtin_memcpy, which does not appear anywhere in the program.  It's not
exactly a serious issue, but it can cause some confusion for users.

When doing call substitution, there should be a way to somehow retain a
reference to the original function so that the warning message can refer to it
instead.

Reply via email to