blob: 64377d380ee914b0c9fd2cf5512d7e670af335ea [file] [log] [blame]
/* PR middle-end/10138 - warn for uninitialized arrays passed as const*
arguments
Verify that passing pointers to uninitialized objects to const
arguments to built-ins is diagnosed where expected.
{ dg-do compile }
{ dg-options "-O -Wall -ftrivial-auto-var-init=zero" }
{ dg-require-effective-target alloca } */
typedef __SIZE_TYPE__ size_t;
void* alloca (size_t);
void* malloc (size_t);
void* realloc (void*, size_t);
void* memcpy (void*, const void*, size_t);
char* strcpy (char*, const char*);
size_t strlen (const char*);
void sink (void*);
void nowarn_array_memcpy (void *d, unsigned n)
{
int a[2];
/* Diagnose this? */
memcpy (d, a, n /* Non-constant to avoid folding into MEM_REF. */);
}
void nowarn_array_plus_cst_memcpy (void *d, unsigned n)
{
int a[3];
/* Diagnose this? */
memcpy (d, a + 1, n);
}
void nowarn_array_plus_var_memcpy (void *d, unsigned n, int i)
{
int a[4];
/* Diagnose this? */
memcpy (d, a + i, n);
}
void nowarn_array_assign_memcpy (char *d, unsigned n)
{
int a[3];
a[1] = 3;
memcpy (d, a, n);
}
void nowarn_array_init_memcpy (char *d, unsigned n)
{
int a[4] = { 0 };
memcpy (d, a, n);
}
void nowarn_array_compound_memcpy (void *d, unsigned n)
{
memcpy (d, (int[2]){ 0 }, n);
}
void nowarn_struct_assign_memcpy (void *d, unsigned n)
{
struct S { int a, b, c, d; } s;
s.b = 1;
s.d = 2;
memcpy (d, &s, n);
}
void nowarn_array_init_strcpy (char *d[], unsigned n)
{
char a[8] = "012";
strcpy (d[0], a);
strcpy (d[1], a + 1);
strcpy (d[1], a + 2);
strcpy (d[1], a + 3);
strcpy (d[1], a + 4);
strcpy (d[1], a + 5);
strcpy (d[1], a + 6);
strcpy (d[1], a + 7);
}
void nowarn_array_assign_strcpy (char *d[], unsigned n)
{
char a[8];
a[0] = '0';
a[1] = '1';
a[2] = '2';
a[3] = '\0';
strcpy (d[0], a);
strcpy (d[1], a + 1);
strcpy (d[1], a + 2);
strcpy (d[1], a + 3);
}
void warn_array_plus_cst_strcpy (char *d, unsigned n)
{
char a[8];
a[0] = '1';
a[1] = '2';
a[2] = '3';
a[3] = '\0';
strcpy (d, a + 4); // { dg-warning "\\\[-Wuninitialized" }
strcpy (d, a + 5); // { dg-warning "\\\[-Wuninitialized" }
strcpy (d, a + 6); // { dg-warning "\\\[-Wuninitialized" }
strcpy (d, a + 7); // { dg-warning "\\\[-Wuninitialized" }
}
void nowarn_array_plus_var_strcpy (char *d, int i)
{
char a[8];
a[0] = '1';
a[1] = '2';
a[2] = '3';
a[3] = '\0';
strcpy (d, a + i);
}
size_t nowarn_array_assign_strlen (const char *s)
{
char a[8];
a[0] = s[0];
a[1] = s[1];
a[2] = s[2];
a[3] = s[3];
size_t n = 0;
n += strlen (a);
n += strlen (a + 1);
n += strlen (a + 2);
n += strlen (a + 3);
return n;
}
size_t warn_array_plus_cst_strlen (const char *s)
{
char a[8];
a[0] = s[0];
a[1] = s[1];
a[2] = s[2];
a[3] = s[3];
return strlen (a + 4); // { dg-warning "\\\[-Wuninitialized" }
}
size_t nowarn_array_plus_var_strlen (const char *s, int i)
{
char a[8];
a[0] = s[0];
a[1] = s[1];
a[2] = s[2];
a[3] = s[3];
return strlen (a + i);
}
size_t nowarn_alloca_assign_strlen (int i)
{
char *p = (char*)alloca (8);
p[i] = '\0';
return strlen (p);
}
size_t nowarn_alloca_escape_strlen (int i)
{
char *p = (char*)alloca (8);
sink (p);
return strlen (p);
}
size_t warn_alloca_strlen (void)
{
char *p = (char*)alloca (8);
return strlen (p); // { dg-warning "\\\[-Wuninitialized" }
}
size_t nowarn_malloc_assign_strlen (int i)
{
char *p = (char*)malloc (8);
p[i] = '\0';
return strlen (p);
}
size_t nowarn_malloc_escape_strlen (int i)
{
char *p = (char*)malloc (8);
sink (p);
return strlen (p);
}
size_t warn_malloc_strlen (void)
{
char *p = (char*)malloc (8);
return strlen (p); // { dg-warning "\\\[-Wuninitialized" }
}
size_t nowarn_realloc_strlen (void *p)
{
char *q = (char*)realloc (p, 8);
return strlen (q);
}
size_t nowarn_vla_assign_strlen (int n, int i)
{
char vla[n];
vla[i] = '\0';
return strlen (vla);
}
size_t nowarn_vla_strcpy_strlen (int n, const char *s, int i)
{
char vla[n];
strcpy (vla, s);
return strlen (vla + i);
}
size_t nowarn_vla_escape_strlen (int n, int i)
{
char vla[n];
sink (vla);
return strlen (vla);
}
size_t warn_vla_strlen (unsigned n)
{
char vla[n];
return strlen (vla); // { dg-warning "\\\[-Wuninitialized" }
}