blob: 93c54c646c069f0d466003241f201b49dad31b65 [file] [log] [blame]
/* { dg-do compile }
{ dg-options "-O2 -Wall" } */
typedef __SIZE_TYPE__ size_t;
void* malloc (size_t);
void* memcpy (void*, const void*, size_t);
size_t strlen (const char *);
// Test case reduced from gcc/attribs.c.
char* sorted_attr_string (char *argv[])
{
size_t n = 0;
unsigned int i;
for (i = 0; argv[i]; ++i)
n += strlen (argv[i]);
char *s = (char*)malloc (n);
n = 0;
for (i = 0; argv[i]; ++i)
{
const char *str = argv[i];
size_t len = strlen (str);
memcpy (s + n, str, len);
n += len + 1;
}
/* Replace "=,-" with "_". */
for (i = 0; i < strlen (s); i++)
if (s[i] == '=')
s[i] = '_'; // { dg-bogus "\\\[-Wstringop-overflow" }
return s;
}
void f (void*);
void nowarn_cond_escape (int c, int *x)
{
extern char a3[3], a5[5];
char *p;
if (c)
{
p = a3;
*x = 2;
}
else
{
p = a5;
*x = 4;
}
f (p); // may modify *x
if (*x == 2)
p[2] = 0;
else if (*x == 4)
p[4] = 0; // { dg-bogus "\\\[-Wstringop-overflow" }
}
void warn_cond_escape (int c, int *x)
{
extern char a3_2[3];
extern char a5_2[5]; // { dg-message "at offset 5 into object 'a5_2'" }
char *p;
if (c)
{
p = a3_2;
*x = 2;
}
else
{
p = a5_2;
*x = 5;
}
f (p); // may modify *x
if (*x == 2)
p[2] = 0;
else if (*x == 5)
p[5] = 0; // { dg-warning "\\\[-Warray-bounds|-Wstringop-overflow" }
}