xref: /llvm-project/clang/test/Sema/warn-format-overflow-truncation.c (revision 56c3b8e997d065b568964f71715ecbbd28c2e4a4)
1*56c3b8e9STakuya Shimizu // RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 %s -verify=kprintf,nonkprintf,expected
2*56c3b8e9STakuya Shimizu // RUN: %clang_cc1 -xc++ -triple x86_64-apple-macosx10.14.0 %s -verify=kprintf,nonkprintf,expected
3*56c3b8e9STakuya Shimizu // RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -Wno-format-truncation -Wno-format-overflow %s -verify
4*56c3b8e9STakuya Shimizu // RUN: %clang_cc1 -xc++ -triple x86_64-apple-macosx10.14.0 -Wno-format-truncation -Wno-format-overflow %s -verify
5*56c3b8e9STakuya Shimizu // RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -Wno-format-truncation-non-kprintf -Wno-format-overflow-non-kprintf %s -verify=kprintf,expected
6*56c3b8e9STakuya Shimizu // RUN: %clang_cc1 -xc++ -triple x86_64-apple-macosx10.14.0 -Wno-format-truncation-non-kprintf -Wno-format-overflow-non-kprintf %s -verify=kprintf,expected
7*56c3b8e9STakuya Shimizu // RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -Wno-format-overflow -Wno-format-truncation -Wformat-truncation-non-kprintf -Wformat-overflow-non-kprintf %s -verify=nonkprintf,expected
8*56c3b8e9STakuya Shimizu // RUN: %clang_cc1 -xc++ -triple x86_64-apple-macosx10.14.0 -Wno-format-overflow -Wno-format-truncation -Wformat-truncation-non-kprintf -Wformat-overflow-non-kprintf %s -verify=nonkprintf,expected
9*56c3b8e9STakuya Shimizu 
10*56c3b8e9STakuya Shimizu typedef unsigned long size_t;
11*56c3b8e9STakuya Shimizu 
12*56c3b8e9STakuya Shimizu #ifdef __cplusplus
13*56c3b8e9STakuya Shimizu extern "C" {
14*56c3b8e9STakuya Shimizu #endif
15*56c3b8e9STakuya Shimizu 
16*56c3b8e9STakuya Shimizu extern int sprintf(char *str, const char *format, ...);
17*56c3b8e9STakuya Shimizu 
18*56c3b8e9STakuya Shimizu #ifdef __cplusplus
19*56c3b8e9STakuya Shimizu }
20*56c3b8e9STakuya Shimizu #endif
21*56c3b8e9STakuya Shimizu 
call_snprintf(double d,int n,int * ptr)22*56c3b8e9STakuya Shimizu void call_snprintf(double d, int n, int *ptr) {
23*56c3b8e9STakuya Shimizu   char buf[10];
24*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 10, "merp");
25*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 11, "merp"); // expected-warning {{'snprintf' size argument is too large; destination buffer has size 10, but size argument is 11}}
26*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 12, "%#12x", n); // kprintf-warning {{'snprintf' will always be truncated; specified size is 12, but format string expands to at least 13}} \
27*56c3b8e9STakuya Shimizu                                            // expected-warning {{'snprintf' size argument is too large; destination buffer has size 10, but size argument is 12}}
28*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 0, "merp");
29*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 3, "merp"); // kprintf-warning {{'snprintf' will always be truncated; specified size is 3, but format string expands to at least 5}}
30*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 4, "merp"); // kprintf-warning {{'snprintf' will always be truncated; specified size is 4, but format string expands to at least 5}}
31*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 5, "merp");
32*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 1, "%.1000g", d); // kprintf-warning {{'snprintf' will always be truncated; specified size is 1, but format string expands to at least 2}}
33*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 5, "%.1000g", d);
34*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 5, "%.1000G", d);
35*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 10, " %#08x", n);
36*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 2, "%#x", n);
37*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 2, "%#X", n);
38*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 2, "%#o", n);
39*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 1, "%#x", n); // kprintf-warning {{'snprintf' will always be truncated; specified size is 1, but format string expands to at least 2}}
40*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 1, "%#X", n); // kprintf-warning {{'snprintf' will always be truncated; specified size is 1, but format string expands to at least 2}}
41*56c3b8e9STakuya Shimizu   __builtin_snprintf(buf, 1, "%#o", n); // kprintf-warning {{'snprintf' will always be truncated; specified size is 1, but format string expands to at least 2}}
42*56c3b8e9STakuya Shimizu   char node_name[6];
43*56c3b8e9STakuya Shimizu   __builtin_snprintf(node_name, sizeof(node_name), "%pOFn", ptr); // nonkprintf-warning {{'snprintf' will always be truncated; specified size is 6, but format string expands to at least 7}}
44*56c3b8e9STakuya Shimizu   __builtin_snprintf(node_name, sizeof(node_name), "12345%pOFn", ptr); // nonkprintf-warning {{'snprintf' will always be truncated; specified size is 6, but format string expands to at least 12}}
45*56c3b8e9STakuya Shimizu   __builtin_snprintf(node_name, sizeof(node_name), "123456%pOFn", ptr); // nonkprintf-warning {{'snprintf' will always be truncated; specified size is 6, but format string expands to at least 13}}
46*56c3b8e9STakuya Shimizu }
47*56c3b8e9STakuya Shimizu 
call_vsnprintf(void)48*56c3b8e9STakuya Shimizu void call_vsnprintf(void) {
49*56c3b8e9STakuya Shimizu   char buf[10];
50*56c3b8e9STakuya Shimizu   __builtin_va_list list;
51*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 10, "merp", list);
52*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 11, "merp", list); // expected-warning {{'vsnprintf' size argument is too large; destination buffer has size 10, but size argument is 11}}
53*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 0, "merp", list);
54*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 3, "merp", list); // kprintf-warning {{'vsnprintf' will always be truncated; specified size is 3, but format string expands to at least 5}}
55*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 4, "merp", list); // kprintf-warning {{'vsnprintf' will always be truncated; specified size is 4, but format string expands to at least 5}}
56*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 5, "merp", list);
57*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 1, "%.1000g", list); // kprintf-warning {{'vsnprintf' will always be truncated; specified size is 1, but format string expands to at least 2}}
58*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 5, "%.1000g", list);
59*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 5, "%.1000G", list);
60*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 10, " %#08x", list);
61*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 2, "%#x", list);
62*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 2, "%#X", list);
63*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 2, "%#o", list);
64*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 1, "%#x", list); // kprintf-warning {{'vsnprintf' will always be truncated; specified size is 1, but format string expands to at least 2}}
65*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 1, "%#X", list); // kprintf-warning {{'vsnprintf' will always be truncated; specified size is 1, but format string expands to at least 2}}
66*56c3b8e9STakuya Shimizu   __builtin_vsnprintf(buf, 1, "%#o", list); // kprintf-warning {{'vsnprintf' will always be truncated; specified size is 1, but format string expands to at least 2}}
67*56c3b8e9STakuya Shimizu   char node_name[6];
68*56c3b8e9STakuya Shimizu   __builtin_snprintf(node_name, sizeof(node_name), "%pOFn", list); // nonkprintf-warning {{'snprintf' will always be truncated; specified size is 6, but format string expands to at least 7}}
69*56c3b8e9STakuya Shimizu   __builtin_snprintf(node_name, sizeof(node_name), "12345%pOFn", list); // nonkprintf-warning {{'snprintf' will always be truncated; specified size is 6, but format string expands to at least 12}}
70*56c3b8e9STakuya Shimizu   __builtin_snprintf(node_name, sizeof(node_name), "123456%pOFn", list); // nonkprintf-warning {{'snprintf' will always be truncated; specified size is 6, but format string expands to at least 13}}
71*56c3b8e9STakuya Shimizu }
72*56c3b8e9STakuya Shimizu 
call_sprintf_chk(char * buf)73*56c3b8e9STakuya Shimizu void call_sprintf_chk(char *buf) {
74*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 6, "hell\n");
75*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 5, "hell\n");     // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 5, but format string expands to at least 6}}
76*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 6, "hell\0 boy"); // expected-warning {{format string contains '\0' within the string body}}
77*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "hell\0 boy"); // expected-warning {{format string contains '\0' within the string body}} \
78*56c3b8e9STakuya Shimizu                                                     // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 2, but format string expands to at least 5}}
79*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 6, "hello");
80*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 5, "hello"); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 5, but format string expands to at least 6}}
81*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "%c", '9');
82*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 1, "%c", '9'); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 1, but format string expands to at least 2}}
83*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "%d", 9);
84*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 1, "%d", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 1, but format string expands to at least 2}}
85*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "%i", 9);
86*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 1, "%i", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 1, but format string expands to at least 2}}
87*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "%o", 9);
88*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 1, "%o", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 1, but format string expands to at least 2}}
89*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "%u", 9);
90*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 1, "%u", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 1, but format string expands to at least 2}}
91*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "%x", 9);
92*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 1, "%x", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 1, but format string expands to at least 2}}
93*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "%X", 9);
94*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 1, "%X", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 1, but format string expands to at least 2}}
95*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "%hhd", (char)9);
96*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 1, "%hhd", (char)9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 1, but format string expands to at least 2}}
97*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "%hd", (short)9);
98*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 1, "%hd", (short)9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 1, but format string expands to at least 2}}
99*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "%ld", 9l);
100*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 1, "%ld", 9l); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 1, but format string expands to at least 2}}
101*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "%lld", 9ll);
102*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 1, "%lld", 9ll); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 1, but format string expands to at least 2}}
103*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "%%");
104*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 1, "%%"); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 1, but format string expands to at least 2}}
105*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 4, "%#x", 9);
106*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 3, "%#x", 9);
107*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 4, "%p", (void *)9);
108*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 3, "%p", (void *)9); // nonkprintf-warning {{'sprintf' will always overflow; destination buffer has size 3, but format string expands to at least 4}}
109*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 3, "%+d", 9);
110*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "%+d", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 2, but format string expands to at least 3}}
111*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 3, "% i", 9);
112*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 2, "% i", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 2, but format string expands to at least 3}}
113*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 6, "%5d", 9);
114*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 5, "%5d", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 5, but format string expands to at least 6}}
115*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 9, "%f", 9.f);
116*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 8, "%f", 9.f); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 8, but format string expands to at least 9}}
117*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 9, "%Lf", (long double)9.);
118*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 8, "%Lf", (long double)9.); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 8, but format string expands to at least 9}}
119*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 10, "%+f", 9.f);
120*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 9, "%+f", 9.f); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 9, but format string expands to at least 10}}
121*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 12, "%e", 9.f);
122*56c3b8e9STakuya Shimizu   __builtin___sprintf_chk(buf, 1, 11, "%e", 9.f); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 11, but format string expands to at least 12}}
123*56c3b8e9STakuya Shimizu }
124*56c3b8e9STakuya Shimizu 
call_sprintf(void)125*56c3b8e9STakuya Shimizu void call_sprintf(void) {
126*56c3b8e9STakuya Shimizu   char buf[6];
127*56c3b8e9STakuya Shimizu   sprintf(buf, "hell\0 boy"); // expected-warning {{format string contains '\0' within the string body}}
128*56c3b8e9STakuya Shimizu   sprintf(buf, "hello b\0y"); // expected-warning {{format string contains '\0' within the string body}} \
129*56c3b8e9STakuya Shimizu                               // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 8}}
130*56c3b8e9STakuya Shimizu   sprintf(buf, "hello");
131*56c3b8e9STakuya Shimizu   sprintf(buf, "hello!"); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}
132*56c3b8e9STakuya Shimizu   sprintf(buf, "1234%%");
133*56c3b8e9STakuya Shimizu   sprintf(buf, "12345%%"); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}
134*56c3b8e9STakuya Shimizu   sprintf(buf, "1234%c", '9');
135*56c3b8e9STakuya Shimizu   sprintf(buf, "12345%c", '9'); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}
136*56c3b8e9STakuya Shimizu   sprintf(buf, "1234%d", 9);
137*56c3b8e9STakuya Shimizu   sprintf(buf, "12345%d", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}
138*56c3b8e9STakuya Shimizu   sprintf(buf, "1234%lld", 9ll);
139*56c3b8e9STakuya Shimizu   sprintf(buf, "12345%lld", 9ll); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}
140*56c3b8e9STakuya Shimizu   sprintf(buf, "12%#x", 9);
141*56c3b8e9STakuya Shimizu   sprintf(buf, "123%#x", 9);
142*56c3b8e9STakuya Shimizu   sprintf(buf, "12%p", (void *)9);
143*56c3b8e9STakuya Shimizu   sprintf(buf, "123%p", (void *)9); // nonkprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}
144*56c3b8e9STakuya Shimizu   sprintf(buf, "123%+d", 9);
145*56c3b8e9STakuya Shimizu   sprintf(buf, "1234%+d", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}
146*56c3b8e9STakuya Shimizu   sprintf(buf, "123% i", 9);
147*56c3b8e9STakuya Shimizu   sprintf(buf, "1234% i", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}
148*56c3b8e9STakuya Shimizu   sprintf(buf, "%5d", 9);
149*56c3b8e9STakuya Shimizu   sprintf(buf, "1%5d", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}
150*56c3b8e9STakuya Shimizu   sprintf(buf, "%.3f", 9.f);
151*56c3b8e9STakuya Shimizu   sprintf(buf, "5%.3f", 9.f); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}
152*56c3b8e9STakuya Shimizu   sprintf(buf, "%+.2f", 9.f);
153*56c3b8e9STakuya Shimizu   sprintf(buf, "%+.3f", 9.f); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}
154*56c3b8e9STakuya Shimizu   sprintf(buf, "%.0e", 9.f);
155*56c3b8e9STakuya Shimizu   sprintf(buf, "5%.1e", 9.f); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 8}}
156*56c3b8e9STakuya Shimizu }
157