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
|
/* PR middle-end/97373 - missing warning on sprintf into allocated destination
{ dg-do compile }
{ dg-options "-O2 -Wall -ftrack-macro-expansion=0" }
{ dg-require-effective-target alloca } */
#include "../range.h"
extern void* alloca (size_t);
extern void* malloc (size_t);
extern int sprintf (char*, const char*, ...);
#define sprintf(d, ...) (sprintf (d, __VA_ARGS__), sink (d))
void sink (void*, ...);
void test_alloca_range (void)
{
int n1_2 = UR (1, 2);
int n5_9 = UR (5, 9);
char *d = (char*)alloca (n5_9);
sprintf (d, "%i", 12345);
d += n1_2;
sprintf (d, "%i", 12345);
d += n1_2;
sprintf (d, "%i", 12345);
d += n1_2;
sprintf (d, "%i", 12345);
d += n1_2;
sprintf (d, "%i", 12345); // { dg-warning "writing a terminating nul past the end of the destination" }
d += n1_2;
sprintf (d, "%i", 12345); // { dg-warning "'%i' directive writing 5 bytes into a region of size 4" }
}
void test_malloc_range (void)
{
int n2_3 = UR (2, 3);
int n5_9 = UR (5, 9);
char *d = (char*)malloc (n5_9);
sprintf (d, "%i", 12345);
d += n2_3;
sprintf (d, "%i", 12345);
d += n2_3;
sprintf (d, "%i", 12345); // { dg-warning "writing a terminating nul past the end of the destination" }
d += n2_3;
sprintf (d, "%i", 12345); // { dg-warning "'%i' directive writing 5 bytes into a region of size 3" }
}
void test_vla_range (void)
{
int n3_4 = UR (3, 4);
int n5_9 = UR (5, 9);
char vla[n5_9];
char *d = vla;
sprintf (d, "%i", 12345);
d += n3_4;
sprintf (d, "%i", 12345);
d += n3_4;
sprintf (d, "%i", 12345); // { dg-warning "'%i' directive writing 5 bytes into a region of size 3" }
}
|