blob: b485611e994dff5d79d9ff05d133d5c4871047dc [file] [log] [blame]
/* Verify that calls to non-modifying built-ins aren't considered
potentially modifying.
{ dg-do compile }
{ dg-options "-O2 -Wall" } */
typedef __SIZE_TYPE__ size_t;
void* alloca (size_t);
void* calloc (size_t, size_t);
void* malloc (size_t);
int printf (const char *, ...);
int scanf (const char *, ...);
int sprintf (char *, const char *, ...);
int snprintf (char *, size_t, const char *, ...);
int puts (const char *);
char* strcpy (char*, const char*);
size_t strlen (const char*);
void noproto ();
void sink (int, ...);
extern char a[];
void nowarn_noproto (const char *fmt)
{
int i;
noproto (&i);
sink (i);
}
void nowarn_scanf (const char *fmt)
{
int i;
scanf ("%i", &i);
sink (i);
}
void test_puts_sprintf_alloca (const char *fmt)
{
char *p;
{
p = alloca (8);
sprintf (a, fmt, p); // fmt might contain %n
puts (p);
}
{
p = alloca (8);
snprintf (0, 0, fmt, p); // same as above
puts (p);
}
}
void test_puts_alloca (const char *s)
{
char *p = alloca (8);
{
char a[] = "foo";
puts (a);
}
puts (p); // { dg-warning "-Wuninitialized" }
{
p = alloca (strlen (s) + 1);
strcpy (p, s);
puts (p);
}
{
/* Verify that the puts() calls above isn't considered to have
potentially modified *P, and same for the one below. */
p = alloca (strlen (s));
puts (p); // { dg-warning "-Wuninitialized" }
puts (p + 1); // { dg-warning "-Wuninitialized" }
}
}
void test_puts_malloc (const char *s, const char *t)
{
char *p;
{
p = malloc (strlen (s) + 1);
strcpy (p, s);
puts (p);
}
{
p = malloc (strlen (t));
puts (p); // { dg-warning "-Wuninitialized" }
}
}
void test_puts_vla (const char *s, const char *t)
{
{
char a[strlen (s) + 1];
strcpy (a, s);
puts (a);
}
{
char b[strlen (t)];
puts (b); // { dg-warning "-Wuninitialized" }
}
}
void test_printf_puts (const char *s)
{
char *p = __builtin_malloc (1);
printf ("%s", s);
puts (p); // { dg-warning "-Wuninitialized" }
}