brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.2 KiB · eb1feaa Raw
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