1 /* PR middle-end/97373 - missing warning on sprintf into allocated destination
2    { dg-do compile }
3    { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
4 
5 #include "../range.h"
6 
7 extern void* alloca (size_t);
8 extern void* malloc (size_t);
9 
10 extern int sprintf (char*, const char*, ...);
11 #define sprintf(d, ...) (sprintf (d, __VA_ARGS__), sink (d))
12 
13 void sink (void*, ...);
14 
test_alloca_range(void)15 void test_alloca_range (void)
16 {
17   int n1_2 = UR (1, 2);
18   int n5_9 = UR (5, 9);
19 
20   char *d = (char*)alloca (n5_9);
21 
22   sprintf (d, "%i", 12345);
23 
24   d += n1_2;
25   sprintf (d, "%i", 12345);
26 
27   d += n1_2;
28   sprintf (d, "%i", 12345);
29 
30   d += n1_2;
31   sprintf (d, "%i", 12345);
32 
33   d += n1_2;
34   sprintf (d, "%i", 12345);         // { dg-warning "writing a terminating nul past the end of the destination" }
35 
36   d += n1_2;
37   sprintf (d, "%i", 12345);         // { dg-warning "'%i' directive writing 5 bytes into a region of size 4" }
38 }
39 
40 
test_malloc_range(void)41 void test_malloc_range (void)
42 {
43   int n2_3 = UR (2, 3);
44   int n5_9 = UR (5, 9);
45 
46   char *d = (char*)malloc (n5_9);
47 
48   sprintf (d, "%i", 12345);
49 
50   d += n2_3;
51   sprintf (d, "%i", 12345);
52 
53   d += n2_3;
54   sprintf (d, "%i", 12345);         // { dg-warning "writing a terminating nul past the end of the destination" }
55 
56   d += n2_3;
57   sprintf (d, "%i", 12345);         // { dg-warning "'%i' directive writing 5 bytes into a region of size 3" }
58 }
59 
60 
test_vla_range(void)61 void test_vla_range (void)
62 {
63   int n3_4 = UR (3, 4);
64   int n5_9 = UR (5, 9);
65 
66   char vla[n5_9];
67   char *d = vla;
68 
69   sprintf (d, "%i", 12345);
70 
71   d += n3_4;
72   sprintf (d, "%i", 12345);
73 
74   d += n3_4;
75   sprintf (d, "%i", 12345);         // { dg-warning "'%i' directive writing 5 bytes into a region of size 3" }
76 }
77