| |
| /* 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); |
| } |
| } |