annotate gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-8.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* PR middle-end/78519 - missing warning for sprintf %s with null pointer
kono
parents:
diff changeset
2 Also exercises null destination pointer and null format string.
kono
parents:
diff changeset
3 { dg-do compile }
kono
parents:
diff changeset
4 { dg-options "-O2 -Wformat -Wformat-overflow -Wno-nonnull -ftrack-macro-expansion=0" } */
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 typedef __builtin_va_list va_list;
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 #define sprintf __builtin_sprintf
kono
parents:
diff changeset
9 #define snprintf __builtin_snprintf
kono
parents:
diff changeset
10 #define vsprintf __builtin_vsprintf
kono
parents:
diff changeset
11 #define vsnprintf __builtin_vsnprintf
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 static char* null (void)
kono
parents:
diff changeset
15 {
kono
parents:
diff changeset
16 return 0;
kono
parents:
diff changeset
17 }
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 void sink (int);
kono
parents:
diff changeset
21 #define T sink
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 /* Verify that calls with a null destination pointer are diagnosed. */
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 void test_null_dest (va_list va)
kono
parents:
diff changeset
27 {
kono
parents:
diff changeset
28 char *p = null ();
kono
parents:
diff changeset
29 T (sprintf (null (), "%i", 0)); /* { dg-warning "null destination pointer" } */
kono
parents:
diff changeset
30 T (sprintf (p, "%i", 0)); /* { dg-warning "null destination pointer" } */
kono
parents:
diff changeset
31 T (sprintf (p, "%i abc", 0)); /* { dg-warning "null destination pointer" } */
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 T (snprintf (null (), 1, "%i", 0)); /* { dg-warning "null destination pointer" } */
kono
parents:
diff changeset
34 T (snprintf (p, 2, "%i", 0)); /* { dg-warning "null destination pointer" } */
kono
parents:
diff changeset
35 T (snprintf (p, 3, "%i abc", 0)); /* { dg-warning "null destination pointer" } */
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 /* Snprintf with a null pointer and a zero size is a special request
kono
parents:
diff changeset
38 to determine the size of output without writing any. Such calls
kono
parents:
diff changeset
39 are valid must not be diagnosed. */
kono
parents:
diff changeset
40 T (snprintf (p, 0, "%i", 0));
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 T (vsprintf (null (), "%i", va)); /* { dg-warning "null destination pointer" } */
kono
parents:
diff changeset
43 T (vsprintf (p, "%i", va)); /* { dg-warning "null destination pointer" } */
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 T (vsnprintf (null (), 1, "%i", va)); /* { dg-warning "null destination pointer" } */
kono
parents:
diff changeset
46 T (vsnprintf (p, 2, "%i", va)); /* { dg-warning "null destination pointer" } */
kono
parents:
diff changeset
47 T (vsnprintf (p, 0, "%i", va));
kono
parents:
diff changeset
48 }
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 void test_null_format (char *d, va_list va)
kono
parents:
diff changeset
51 {
kono
parents:
diff changeset
52 char *fmt = null ();
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 T (sprintf (d, null ())); /* { dg-warning "null format string" } */
kono
parents:
diff changeset
55 T (sprintf (d, fmt)); /* { dg-warning "null format string" } */
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 T (snprintf (d, 0, null ())); /* { dg-warning "null format string" } */
kono
parents:
diff changeset
58 T (snprintf (d, 1, fmt)); /* { dg-warning "null format string" } */
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 T (vsprintf (d, null (), va)); /* { dg-warning "null format string" } */
kono
parents:
diff changeset
61 T (vsprintf (d, fmt, va)); /* { dg-warning "null format string" } */
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 T (vsnprintf (d, 0, null (), va)); /* { dg-warning "null format string" } */
kono
parents:
diff changeset
64 T (vsnprintf (d, 1, fmt, va)); /* { dg-warning "null format string" } */
kono
parents:
diff changeset
65 }
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 void test_null_arg (char *d, const char *s)
kono
parents:
diff changeset
68 {
kono
parents:
diff changeset
69 char *p = null ();
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 T (sprintf (d, "%-s", null ())); /* { dg-warning "directive argument is null" } */
kono
parents:
diff changeset
72 T (sprintf (d, "%-s", p)); /* { dg-warning "directive argument is null" } */
kono
parents:
diff changeset
73 T (sprintf (d, "%s %s", p, s)); /* { dg-warning "directive argument is null" } */
kono
parents:
diff changeset
74 T (sprintf (d, "%s %s", s, p)); /* { dg-warning "directive argument is null" } */
kono
parents:
diff changeset
75 T (sprintf (d, "%s %i", p, 1)); /* { dg-warning "directive argument is null" } */
kono
parents:
diff changeset
76 T (sprintf (d, "%i %s", 1, p)); /* { dg-warning "directive argument is null" } */
kono
parents:
diff changeset
77 T (sprintf (d, "%.0s", p)); /* { dg-warning "directive argument is null" } */
kono
parents:
diff changeset
78 T (sprintf (d, "%1.0s", p)); /* { dg-warning "directive argument is null" } */
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 T (snprintf (d, 0, "%-s", null ())); /* { dg-warning "directive argument is null" } */
kono
parents:
diff changeset
81 T (snprintf (d, 1, "%-s", p)); /* { dg-warning "directive argument is null" } */
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 T (sprintf (d, "%i %s", 1, null ())); /* { dg-warning "directive argument is null" } */
kono
parents:
diff changeset
84 T (sprintf (d, "%i %s", 2, p)); /* { dg-warning "directive argument is null" } */
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 T (snprintf (d, 0, "%i %s", 1, null ())); /* { dg-warning "directive argument is null" } */
kono
parents:
diff changeset
87 T (snprintf (d, 9, "%i %s", 2, p)); /* { dg-warning "directive argument is null" } */
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 /* A sanity check that the %p directive doesn't emit a warning
kono
parents:
diff changeset
90 with a null pointer. */
kono
parents:
diff changeset
91 T (sprintf (d, "%p", null ()));
kono
parents:
diff changeset
92 T (sprintf (d, "%p", p));
kono
parents:
diff changeset
93 }