1 /* { dg-do compile } */
2 /* { dg-options "-O2 -Wformat -Wformat-truncation=2 -ftrack-macro-expansion=0" } */
7 /* Separate a0 from a1 to prevent the former from being substituted
8 for the latter and causing false positives. */
18 #define buffer(size) (buffer + sizeof buffer - size)
20 static int value_range (int min
, int max
)
22 extern int value (void);
24 return val
< min
|| max
< val
? min
: val
;
27 #define R(min, max) value_range (min, max)
29 /* Verify that calls to snprintf whose return value is unused are
30 diagnosed if certain or possible truncation is detected. */
32 #define T(size, ...) \
33 __builtin_snprintf (buffer (size), size, __VA_ARGS__)
35 void test_int_retval_unused (void)
37 T (2, "%i", 123); /* { dg-warning "output truncated" } */
38 T (2, "%i", R (1, 99)); /* { dg-warning "output may be truncated" } */
39 T (2, "%i", R (10, 99)); /* { dg-warning "output truncated" } */
40 T (3, "%i%i", R (1, 99), R (1, 99)); /* { dg-warning "output may be truncated" } */
43 void test_string_retval_unused (const Arrays
*ar
)
45 /* At level 2 strings of unknown length are assumed to be 1 character
46 long, so the following is diagnosed. */
47 T (1, "%-s", ar
->a0
); /* { dg-warning "output may be truncated" } */
49 T (1, "%-s", ar
->a2
); /* { dg-warning "output may be truncated" } */
53 /* Verify that (at -Wformat-trunc=2) calls to snprintf whose return value
54 is used are diagnosed the same way as those whose value is unused. */
59 #define T(size, ...) \
60 retval = __builtin_snprintf (buffer (size), size, __VA_ARGS__)
62 void test_int_retval_used (void)
64 T (2, "%i", 123); /* { dg-warning "output truncated" } */
65 T (2, "%i", R (1, 99)); /* { dg-warning "output may be truncated" } */
66 T (2, "%i", R (10, 99)); /* { dg-warning "output truncated" } */
67 T (3, "%i%i", R (1, 99), R (1, 99)); /* { dg-warning "output may be truncated" } */
70 void test_string_retval_used (const Arrays
*ar
)
72 T (1, "%-s", ar
->a0
); /* { dg-warning "output may be truncated" } */
74 T (1, "%-s", ar
->a2
); /* { dg-warning "output may be truncated" } */