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

            Bug ID: 93531
           Summary: missing -Wrestrict calling strcat with strcpy as
                    argument
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

In the following test case only the overlapping calls are diagnosed that pass
the source argument as the destination are diagnosed; none of those is that
pass the result of a string function that returns its argument to another.

$ cat a.c && gcc -O2 -S -Wall a.c
extern void* memcpy (void*, const void*, __SIZE_TYPE__);
extern char* strcat (char*, const char*);
extern char* strcpy (char*, const char*);

const char *s1, *s2;

void f0 (char *s)
{
  memcpy (memcpy (s, s, 4), s1, 4);     // missing -Wrestrict
}

void f1 (char *s)
{
  memcpy (memcpy (s, s1, 4), s, 4);     // missing -Wrestrict
}


void g0 (char *s)
{
  strcpy (strcpy (s, s), s1);           // -Wrestrict (good)
}

void g1 (char *s)
{
  strcpy (strcpy (s, s1), s);           // missing -Wrestrict
}


void h0 (char *s)
{
  strcat (strcat (s, s), s1);           // -Wrestrict (good)
}

void h1 (char *s)
{
  strcat (strcat (s, s1), s);           // missing -Wrestrict
}
a.c: In function ‘g0’:
a.c:20:3: warning: ‘strcpy’ source argument is the same as destination
[-Wrestrict]
   20 |   strcpy (strcpy (s, s), s1);           // -Wrestrict (good)
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~
a.c: In function ‘h0’:
a.c:31:3: warning: ‘strcat’ source argument is the same as destination
[-Wrestrict]
   31 |   strcat (strcat (s, s), s1);           // -Wrestrict (good)
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~

Reply via email to