1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
/* Verify that calls to non-modifying built-ins aren't considered
potentially modifying.
{ dg-do compile }
{ dg-options "-O2 -Wall" }
{ dg-require-effective-target alloca } */
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" }
}
|