libcpp, c, middle-end: Optimize initializers using #embed in C
[official-gcc.git] / gcc / testsuite / gcc.dg / tree-ssa / builtin-sprintf-warn-25.c
bloba28f0668c91783eddd8eb2b183dbcdf92ae9ab70
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 { dg-require-effective-target alloca } */
6 #include "../range.h"
8 extern void* alloca (size_t);
9 extern void* malloc (size_t);
11 extern int sprintf (char*, const char*, ...);
12 #define sprintf(d, ...) (sprintf (d, __VA_ARGS__), sink (d))
14 void sink (void*, ...);
16 void test_alloca_range (void)
18 int n1_2 = UR (1, 2);
19 int n5_9 = UR (5, 9);
21 char *d = (char*)alloca (n5_9);
23 sprintf (d, "%i", 12345);
25 d += n1_2;
26 sprintf (d, "%i", 12345);
28 d += n1_2;
29 sprintf (d, "%i", 12345);
31 d += n1_2;
32 sprintf (d, "%i", 12345);
34 d += n1_2;
35 sprintf (d, "%i", 12345); // { dg-warning "writing a terminating nul past the end of the destination" }
37 d += n1_2;
38 sprintf (d, "%i", 12345); // { dg-warning "'%i' directive writing 5 bytes into a region of size 4" }
42 void test_malloc_range (void)
44 int n2_3 = UR (2, 3);
45 int n5_9 = UR (5, 9);
47 char *d = (char*)malloc (n5_9);
49 sprintf (d, "%i", 12345);
51 d += n2_3;
52 sprintf (d, "%i", 12345);
54 d += n2_3;
55 sprintf (d, "%i", 12345); // { dg-warning "writing a terminating nul past the end of the destination" }
57 d += n2_3;
58 sprintf (d, "%i", 12345); // { dg-warning "'%i' directive writing 5 bytes into a region of size 3" }
62 void test_vla_range (void)
64 int n3_4 = UR (3, 4);
65 int n5_9 = UR (5, 9);
67 char vla[n5_9];
68 char *d = vla;
70 sprintf (d, "%i", 12345);
72 d += n3_4;
73 sprintf (d, "%i", 12345);
75 d += n3_4;
76 sprintf (d, "%i", 12345); // { dg-warning "'%i' directive writing 5 bytes into a region of size 3" }