annotate gcc/testsuite/gcc.dg/tree-ssa/builtin-snprintf-warn-1.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 /* { dg-do compile } */
kono
parents:
diff changeset
2 /* { dg-options "-O2 -Wformat -Wformat-truncation=1 -ftrack-macro-expansion=0" } */
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 typedef struct
kono
parents:
diff changeset
5 {
kono
parents:
diff changeset
6 char a0[0];
kono
parents:
diff changeset
7 /* Separate a0 from a1 to prevent the former from being substituted
kono
parents:
diff changeset
8 for the latter and causing false positives. */
kono
parents:
diff changeset
9 int: 8;
kono
parents:
diff changeset
10 char a1[1];
kono
parents:
diff changeset
11 char a2[2];
kono
parents:
diff changeset
12 char a3[3];
kono
parents:
diff changeset
13 char a4[4];
kono
parents:
diff changeset
14 char ax[];
kono
parents:
diff changeset
15 } Arrays;
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 char buffer[1024];
kono
parents:
diff changeset
18 #define buffer(size) (buffer + sizeof buffer - size)
kono
parents:
diff changeset
19
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
20 static int value_range (int min, int max)
111
kono
parents:
diff changeset
21 {
kono
parents:
diff changeset
22 extern int value (void);
kono
parents:
diff changeset
23 int val = value ();
kono
parents:
diff changeset
24 return val < min || max < val ? min : val;
kono
parents:
diff changeset
25 }
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 #define R(min, max) value_range (min, max)
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 extern void sink (void*);
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 /* Verify that calls to snprintf whose return value is unused are
kono
parents:
diff changeset
32 diagnosed if certain or possible truncation is detected. */
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 #define T(size, ...) \
kono
parents:
diff changeset
35 __builtin_snprintf (buffer (size), size, __VA_ARGS__), sink (buffer)
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 void test_int_retval_unused (void)
kono
parents:
diff changeset
38 {
kono
parents:
diff changeset
39 T (2, "%i", 123); /* { dg-warning "output truncated" } */
kono
parents:
diff changeset
40 T (2, "%i", R (1, 99)); /* { dg-warning "output may be truncated" } */
kono
parents:
diff changeset
41 T (2, "%i", R (10, 99)); /* { dg-warning "output truncated" } */
kono
parents:
diff changeset
42 T (3, "%i%i", R (1, 99), R (1, 99)); /* { dg-warning "output may be truncated" } */
kono
parents:
diff changeset
43 }
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 void test_string_retval_unused (const Arrays *ar)
kono
parents:
diff changeset
46 {
kono
parents:
diff changeset
47 /* At level 1 strings of unknown length are assumed to be empty so
kono
parents:
diff changeset
48 the following is not diagnosed. */
kono
parents:
diff changeset
49 T (1, "%-s", ar->a0);
kono
parents:
diff changeset
50 /* A one-byte array can only hold an empty string, so the following
kono
parents:
diff changeset
51 isn't diagnosed. */
kono
parents:
diff changeset
52 T (1, "%-s", ar->a1);
kono
parents:
diff changeset
53 /* Unlike the ar->a0 case above, at level 1, the length of an unknown
kono
parents:
diff changeset
54 string that points to an array of known size is assumed to be the
kono
parents:
diff changeset
55 size of the array minus 1. */
kono
parents:
diff changeset
56 T (1, "%-s", ar->a2); /* { dg-warning "output may be truncated" } */
kono
parents:
diff changeset
57 T (1, "%-s", ar->a3); /* { dg-warning "output may be truncated" } */
kono
parents:
diff changeset
58 T (1, "%-s", ar->a4); /* { dg-warning "output may be truncated" } */
kono
parents:
diff changeset
59 /* Same as the ar->a0 case above. */
kono
parents:
diff changeset
60 T (1, "%-s", ar->ax);
kono
parents:
diff changeset
61 }
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 /* Verify that calls to snprintf whose return value is used are
kono
parents:
diff changeset
65 diagnosed only if certain truncation is detected but not when
kono
parents:
diff changeset
66 truncation is only possible but not certain. */
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 volatile int retval;
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 #undef T
kono
parents:
diff changeset
71 #define T(size, ...) \
kono
parents:
diff changeset
72 retval = __builtin_snprintf (buffer (size), size, __VA_ARGS__)
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 void test_int_retval_used (void)
kono
parents:
diff changeset
75 {
kono
parents:
diff changeset
76 T (2, "%i", 123); /* { dg-warning "output truncated" } */
kono
parents:
diff changeset
77 T (2, "%i", R (1, 99));
kono
parents:
diff changeset
78 T (2, "%i", R (10, 99)); /* { dg-warning "output truncated" } */
kono
parents:
diff changeset
79 T (3, "%i%i", R (1, 99), R (1, 99));
kono
parents:
diff changeset
80 }
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 void test_string_retval_used (const Arrays *ar)
kono
parents:
diff changeset
83 {
kono
parents:
diff changeset
84 T (1, "%-s", ar->a0);
kono
parents:
diff changeset
85 T (1, "%-s", ar->a1);
kono
parents:
diff changeset
86 T (1, "%-s", ar->a2);
kono
parents:
diff changeset
87 T (1, "%-s", ar->a3);
kono
parents:
diff changeset
88 T (1, "%-s", ar->a4);
kono
parents:
diff changeset
89 T (1, "%-s", "123"); /* { dg-warning "output truncated" } */
kono
parents:
diff changeset
90 }