| /* PR middle-end/97631 - bogus "writing one too many bytes" warning for |
| memcpy with strlen argument |
| { dg-do compile } |
| { dg-options "-O2 -Wall" } */ |
| |
| #define NOIPA __attribute__ ((noipa)) |
| |
| typedef __SIZE_TYPE__ size_t; |
| |
| extern void* malloc (size_t); |
| extern void* memcpy (void*, const void*, size_t); |
| extern void* memmove (void*, const void*, size_t); |
| extern void* memset (void*, int, size_t); |
| extern char* strcpy (char*, const char*); |
| extern char* strncpy (char*, const char*, size_t); |
| extern size_t strlen (const char*); |
| |
| |
| NOIPA char* nowarn_strcpy (char *s) |
| { |
| size_t n = strlen (s); |
| char *d = malloc (n + 1); |
| strcpy (d, s); |
| return d; |
| } |
| |
| |
| NOIPA char* warn_strcpy (char *s) |
| { |
| size_t n = strlen (s); |
| char *d = malloc (n); |
| strcpy (d, s); // { dg-warning "\\\[-Wstringop-overflow" } |
| return d; |
| } |
| |
| NOIPA char* warn_strcpy_nz (char *s) |
| { |
| size_t n = strlen (s); |
| if (n == 0) |
| return 0; |
| |
| char *d = malloc (n); |
| strcpy (d, s); // { dg-warning "\\\[-Wstringop-overflow" } |
| return d; |
| } |
| |
| NOIPA char* warn_strcpy_nn (char *s) |
| { |
| size_t n = strlen (s); |
| char *d = malloc (n); |
| if (!d) |
| return 0; |
| |
| strcpy (d, s); // { dg-warning "\\\[-Wstringop-overflow" } |
| return d; |
| } |
| |
| NOIPA char* warn_strcpy_nz_nn (char *s) |
| { |
| size_t n = strlen (s); |
| if (n == 0) |
| return 0; |
| |
| char *d = malloc (n); |
| if (!d) |
| return 0; |
| |
| strcpy (d, s); // { dg-warning "\\\[-Wstringop-overflow" } |
| return d; |
| } |
| |
| |
| NOIPA char* nowarn_strncpy_1 (char *s) |
| { |
| /* There's no overflow or truncation below so verify there is no |
| warning either. */ |
| size_t n = strlen (s) + 1; |
| char *d = malloc (n); |
| strncpy (d, s, n); |
| return d; |
| } |
| |
| |
| NOIPA char* warn_strncpy (char *s) |
| { |
| size_t n = strlen (s); |
| char *d = malloc (n); |
| strncpy (d, s, n); // { dg-warning "\\\[-Wstringop-truncation" } |
| return d; |
| } |
| |
| NOIPA char* warn_strncpy_p1 (char *s) |
| { |
| size_t n = strlen (s); |
| char *d = malloc (n + 1); |
| strncpy (d, s, n); // { dg-warning "\\\[-Wstringop-truncation" } |
| return d; |
| } |
| |
| NOIPA char* warn_strncpy_nz (char *s) |
| { |
| size_t n = strlen (s); |
| if (n == 0) |
| return 0; |
| |
| char *d = malloc (n); |
| strncpy (d, s, n); // { dg-warning "\\\[-Wstringop-truncation" } |
| return d; |
| |
| } |
| |
| |
| NOIPA char* nowarn_memcpy (char *s) |
| { |
| size_t n = strlen (s); |
| char *d = malloc (n); |
| memcpy (d, s, n); // { dg-bogus "\\\[-Wstringop-overflow" } |
| return d; |
| } |
| |
| NOIPA char* nowarn_memcpy_nz (char *s) |
| { |
| size_t n = strlen (s); |
| if (n == 0) |
| return 0; |
| |
| char *d = malloc (n); |
| memcpy (d, s, n); // { dg-bogus "\\\[-Wstringop-overflow" } |
| return d; |
| } |
| |
| NOIPA char* nowarn_memcpy_nn (char *s) |
| { |
| size_t n = strlen (s); |
| char *d = malloc (n); |
| if (!d) |
| return 0; |
| |
| memcpy (d, s, n); // { dg-bogus "\\\[-Wstringop-overflow" } |
| return d; |
| } |
| |
| NOIPA char* nowarn_memcpy_nn_nz (char *s) |
| { |
| size_t n = strlen (s); |
| if (n == 0) |
| return 0; |
| |
| char *d = malloc (n); |
| if (!d) |
| return 0; |
| |
| memcpy (d, s, n); // { dg-bogus "\\\[-Wstringop-overflow" } |
| return d; |
| |
| } |
| |
| |
| NOIPA char* nowarn_memmove (char *s) |
| { |
| size_t n = strlen (s); |
| if (n == 0) |
| return 0; |
| |
| char *d = malloc (n); |
| memmove (d, s, n); // { dg-bogus "\\\[-Wstringop-overflow" } |
| return d; |
| } |
| |
| |
| NOIPA char* nowarn_memset (char *s, int c) |
| { |
| size_t n = strlen (s); |
| if (n == 0) |
| return 0; |
| |
| char *d = malloc (n); |
| memset (d, c, n); // { dg-bogus "\\\[-Wstringop-overflow" } |
| return d; |
| } |