blob: a28965557c3de83a63194f50c4dff3b7ec95802b [file] [log] [blame]
/* PR middle-end/97023 - missing warning on buffer overflow in chained mempcpy
Verify that writes by built-in functions to objects through pointers
returned by ordinary (non-built-int) function are assumed to point to
the beginning of objects.
{ dg-do compile }
{ dg-options "-O2" } */
#include "range.h"
void* memcpy (void*, const void*, size_t);
void* memset (void*, int, size_t);
void sink (void*, ...);
extern char* arrptr[];
extern char* ptr;
extern char* retptr (void);
struct S { char *p; };
extern struct S retstruct (void);
void nowarn_ptr (void)
{
{
void *p = arrptr;
memset (p - 1, 0, 12345); // { dg-warning "\\\[-Wstringop-overflow" }
memset (p,0, 12345);
memset (p,0, DIFF_MAX - 1);
}
{
char *p = arrptr[0];
memset (p - 1, 0, 12345);
memset (p - 12345, 0, 12345);
memset (p - 1234, 0, DIFF_MAX - 1);
memset (p - DIFF_MAX + 1, 0, 12345);
}
{
char *p = ptr;
memset (p - 1, 0, 12345);
memset (p - 12345, 0, 12345);
memset (p - 1234, 0, DIFF_MAX - 1);
memset (p - DIFF_MAX + 1, 0, 12345);
}
{
char *p = retptr ();
memset (p - 1, 0, 12345);
memset (p - 12345, 0, 12345);
memset (p - 1234, 0, DIFF_MAX - 1);
memset (p - DIFF_MAX + 1, 0, 12345);
}
{
char *p = retstruct ().p;
memset (p - 1, 0, 12345);
memset (p - 12345, 0, 12345);
memset (p - 1234, 0, DIFF_MAX - 1);
memset (p - DIFF_MAX + 1, 0, 12345);
}
}