171 lines · c
1// RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 %s -verify=kprintf,nonkprintf,expected2// RUN: %clang_cc1 -xc++ -triple x86_64-apple-macosx10.14.0 %s -verify=kprintf,nonkprintf,expected3// RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -Wno-format-truncation -Wno-format-overflow %s -verify4// RUN: %clang_cc1 -xc++ -triple x86_64-apple-macosx10.14.0 -Wno-format-truncation -Wno-format-overflow %s -verify5// RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -Wno-format-truncation-non-kprintf -Wno-format-overflow-non-kprintf %s -verify=kprintf,expected6// RUN: %clang_cc1 -xc++ -triple x86_64-apple-macosx10.14.0 -Wno-format-truncation-non-kprintf -Wno-format-overflow-non-kprintf %s -verify=kprintf,expected7// 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,expected8// 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,expected9 10typedef unsigned long size_t;11 12#ifdef __cplusplus13extern "C" {14#endif15 16extern int sprintf(char *str, const char *format, ...);17 18#ifdef __cplusplus19}20#endif21 22void call_snprintf(double d, int n, int *ptr) {23 char buf[10];24 __builtin_snprintf(buf, 10, "merp");25 __builtin_snprintf(buf, 11, "merp"); // expected-warning {{'snprintf' size argument is too large; destination buffer has size 10, but size argument is 11}}26 __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 // expected-warning {{'snprintf' size argument is too large; destination buffer has size 10, but size argument is 12}}28 __builtin_snprintf(buf, 0, "merp");29 __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 __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 __builtin_snprintf(buf, 5, "merp");32 __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 __builtin_snprintf(buf, 5, "%.1000g", d);34 __builtin_snprintf(buf, 5, "%.1000G", d);35 __builtin_snprintf(buf, 10, " %#08x", n);36 __builtin_snprintf(buf, 2, "%#x", n);37 __builtin_snprintf(buf, 2, "%#X", n);38 __builtin_snprintf(buf, 2, "%#o", n);39 __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 __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 __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 char node_name[6];43 __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 __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 __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 __builtin_snprintf(buf, 6, "%5.1f", 9.f);47 __builtin_snprintf(buf, 6, "%+5.1f", 9.f);48 __builtin_snprintf(buf, 6, "% 5.1f", 9.f);49 __builtin_snprintf(buf, 6, "% 5.1f", 9.f);50 __builtin_snprintf(buf, 6, "%+6.1f", 9.f); // kprintf-warning {{'snprintf' will always be truncated; specified size is 6, but format string expands to at least 7}}51 __builtin_snprintf(buf, 6, "% 6.1f", 9.f); // kprintf-warning {{'snprintf' will always be truncated; specified size is 6, but format string expands to at least 7}}52 __builtin_snprintf(buf, 6, "% 6.1f", 9.f); // kprintf-warning {{'snprintf' will always be truncated; specified size is 6, but format string expands to at least 7}}53}54 55void call_vsnprintf(void) {56 char buf[10];57 __builtin_va_list list;58 __builtin_vsnprintf(buf, 10, "merp", list);59 __builtin_vsnprintf(buf, 11, "merp", list); // expected-warning {{'vsnprintf' size argument is too large; destination buffer has size 10, but size argument is 11}}60 __builtin_vsnprintf(buf, 0, "merp", list);61 __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}}62 __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}}63 __builtin_vsnprintf(buf, 5, "merp", list);64 __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}}65 __builtin_vsnprintf(buf, 5, "%.1000g", list);66 __builtin_vsnprintf(buf, 5, "%.1000G", list);67 __builtin_vsnprintf(buf, 10, " %#08x", list);68 __builtin_vsnprintf(buf, 2, "%#x", list);69 __builtin_vsnprintf(buf, 2, "%#X", list);70 __builtin_vsnprintf(buf, 2, "%#o", list);71 __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}}72 __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}}73 __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}}74 char node_name[6];75 __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}}76 __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}}77 __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}}78}79 80void call_sprintf_chk(char *buf) {81 __builtin___sprintf_chk(buf, 1, 6, "hell\n");82 __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}}83 __builtin___sprintf_chk(buf, 1, 6, "hell\0 boy"); // expected-warning {{format string contains '\0' within the string body}}84 __builtin___sprintf_chk(buf, 1, 2, "hell\0 boy"); // expected-warning {{format string contains '\0' within the string body}} \85 // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 2, but format string expands to at least 5}}86 __builtin___sprintf_chk(buf, 1, 6, "hello");87 __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}}88 __builtin___sprintf_chk(buf, 1, 2, "%c", '9');89 __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}}90 __builtin___sprintf_chk(buf, 1, 2, "%d", 9);91 __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}}92 __builtin___sprintf_chk(buf, 1, 2, "%i", 9);93 __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}}94 __builtin___sprintf_chk(buf, 1, 2, "%o", 9);95 __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}}96 __builtin___sprintf_chk(buf, 1, 2, "%u", 9);97 __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}}98 __builtin___sprintf_chk(buf, 1, 2, "%x", 9);99 __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}}100 __builtin___sprintf_chk(buf, 1, 2, "%X", 9);101 __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}}102 __builtin___sprintf_chk(buf, 1, 2, "%hhd", (char)9);103 __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}}104 __builtin___sprintf_chk(buf, 1, 2, "%hd", (short)9);105 __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}}106 __builtin___sprintf_chk(buf, 1, 2, "%ld", 9l);107 __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}}108 __builtin___sprintf_chk(buf, 1, 2, "%lld", 9ll);109 __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}}110 __builtin___sprintf_chk(buf, 1, 2, "%%");111 __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}}112 __builtin___sprintf_chk(buf, 1, 4, "%#x", 9);113 __builtin___sprintf_chk(buf, 1, 3, "%#x", 9);114 __builtin___sprintf_chk(buf, 1, 4, "%p", (void *)9);115 __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}}116 __builtin___sprintf_chk(buf, 1, 3, "%+d", 9);117 __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}}118 __builtin___sprintf_chk(buf, 1, 3, "% i", 9);119 __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}}120 __builtin___sprintf_chk(buf, 1, 6, "%5d", 9);121 __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}}122 __builtin___sprintf_chk(buf, 1, 9, "%f", 9.f);123 __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}}124 __builtin___sprintf_chk(buf, 1, 9, "%Lf", (long double)9.);125 __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}}126 __builtin___sprintf_chk(buf, 1, 10, "%+f", 9.f);127 __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}}128 __builtin___sprintf_chk(buf, 1, 12, "%e", 9.f);129 __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}}130}131 132void call_sprintf(void) {133 char buf[6];134 sprintf(buf, "hell\0 boy"); // expected-warning {{format string contains '\0' within the string body}}135 sprintf(buf, "hello b\0y"); // expected-warning {{format string contains '\0' within the string body}} \136 // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 8}}137 sprintf(buf, "hello");138 sprintf(buf, "hello!"); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}139 sprintf(buf, "1234%%");140 sprintf(buf, "12345%%"); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}141 sprintf(buf, "1234%c", '9');142 sprintf(buf, "12345%c", '9'); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}143 sprintf(buf, "1234%d", 9);144 sprintf(buf, "12345%d", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}145 sprintf(buf, "1234%lld", 9ll);146 sprintf(buf, "12345%lld", 9ll); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}147 sprintf(buf, "12%#x", 9);148 sprintf(buf, "123%#x", 9);149 sprintf(buf, "12%p", (void *)9);150 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}}151 sprintf(buf, "123%+d", 9);152 sprintf(buf, "1234%+d", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}153 sprintf(buf, "123% i", 9);154 sprintf(buf, "1234% i", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}155 sprintf(buf, "%5d", 9);156 sprintf(buf, "1%5d", 9); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}157 sprintf(buf, "%.3f", 9.f);158 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}}159 sprintf(buf, "%+.2f", 9.f);160 sprintf(buf, "%+.3f", 9.f); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}161 sprintf(buf, "%.0e", 9.f);162 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}}163 sprintf(buf, "%5.1f", 9.f);164 sprintf(buf, "%+5.1f", 9.f);165 sprintf(buf, "% 5.1f", 9.f);166 sprintf(buf, "% 5.1f", 9.f);167 sprintf(buf, "%+6.1f", 9.f); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}168 sprintf(buf, "% 6.1f", 9.f); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}169 sprintf(buf, "% 6.1f", 9.f); // kprintf-warning {{'sprintf' will always overflow; destination buffer has size 6, but format string expands to at least 7}}170}171