blob: 0ecf51149e56fc3b1ca51aa7dec4558b6e57fd85 [file] [log] [blame]
/* 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;
}