145
|
1 /* PR tree-optimization/87756 - missing unterminated argument warning
|
|
2 using address of a constant character
|
|
3 { dg-do compile }
|
|
4 { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
|
|
5
|
|
6 int sprintf (char*, const char*, ...);
|
|
7
|
|
8 extern char* dest (void);
|
|
9 extern void sink (int, ...);
|
|
10
|
|
11 #define D dest ()
|
|
12 #define T(expr) sink (0, (expr))
|
|
13
|
|
14
|
|
15 const char cnul = '\0';
|
|
16 const char cnonul = 'a';
|
|
17 const char str3[] = "123";
|
|
18
|
|
19 const struct
|
|
20 {
|
|
21 char a, b, s[3];
|
|
22 } s1 = { '\0', 'b', "123" },
|
|
23 s2[2] = {
|
|
24 { '\0', 'c', "12" },
|
|
25 { 'd', '\0', "123" }
|
|
26 };
|
|
27
|
|
28 void test_sprintf_s (void)
|
|
29 {
|
|
30 T (sprintf (D, "%s", &cnul));
|
|
31 T (sprintf (D, "%s", &cnonul)); /* { dg-warning "nul-terminated" } */
|
|
32 T (sprintf (D, "%.1s", &cnonul));
|
|
33 T (sprintf (D, "%.2s", &cnonul)); /* { dg-warning "nul-terminated" } */
|
|
34
|
|
35 T (sprintf (D, "%s", &s1.a));
|
|
36 T (sprintf (D, "%s", &s1.b)); /* { dg-warning "nul-terminated" } */
|
|
37 T (sprintf (D, "%.1s", &s1.b));
|
|
38 T (sprintf (D, "%.2s", &s1.b)); /* { dg-warning "nul-terminated" } */
|
|
39 T (sprintf (D, "%s", s1.s)); /* { dg-warning "nul-terminated" } */
|
|
40 T (sprintf (D, "%.3s", s1.s));
|
|
41 T (sprintf (D, "%.4s", s1.s)); /* { dg-warning "nul-terminated" } */
|
|
42
|
|
43 T (sprintf (D, "%.2s", s1.s + 1));
|
|
44 T (sprintf (D, "%.3s", s1.s + 1)); /* { dg-warning "nul-terminated" } */
|
|
45
|
|
46 T (sprintf (D, "%s", &s2[0].a));
|
|
47 T (sprintf (D, "%s", &s2[0].b)); /* { dg-warning "nul-terminated" } */
|
|
48 T (sprintf (D, "%.1s", &s2[0].b));
|
|
49 T (sprintf (D, "%.2s", &s2[0].b)); /* { dg-warning "nul-terminated" } */
|
|
50 T (sprintf (D, "%s", s2[0].s));
|
|
51 T (sprintf (D, "%.3s", s2[0].s));
|
|
52 T (sprintf (D, "%.4s", s2[0].s));
|
|
53
|
|
54 T (sprintf (D, "%.2s", s2[0].s + 1));
|
|
55 T (sprintf (D, "%.3s", s2[0].s + 1));
|
|
56
|
|
57 T (sprintf (D, "%s", &s2[1].a)); /* { dg-warning "nul-terminated" } */
|
|
58 T (sprintf (D, "%.1s", &s2[1].a));
|
|
59 T (sprintf (D, "%.2s", &s2[1].a)); /* { dg-warning "nul-terminated" } */
|
|
60 T (sprintf (D, "%s", &s2[1].b));
|
|
61 T (sprintf (D, "%s", s2[1].s)); /* { dg-warning "nul-terminated" } */
|
|
62 T (sprintf (D, "%.3s", s2[1].s));
|
|
63 T (sprintf (D, "%.4s", s2[1].s)); /* { dg-warning "nul-terminated" } */
|
|
64
|
|
65 T (sprintf (D, "%.2s", s2[1].s + 1));
|
|
66 T (sprintf (D, "%.3s", s2[1].s + 1)); /* { dg-warning "nul-terminated" } */
|
|
67
|
|
68 T (sprintf (D, "%s", &str3[3]));
|
|
69 T (sprintf (D, "%s", &str3[4])); /* { dg-warning "\\\[-Warray-bounds" } */
|
|
70 }
|