1bbb6bb4952b77e57b842b4d3096848123ae690e7Jordan Rose// RUN: %clang_cc1 -fsyntax-only -verify -Wformat-nonliteral %s 21e4c33a677ba085bbbbfff211719ae4bb571c5b1Ted Kremenek 3c8769460f1c03bc321b00f5611f9965e8385e64dHans Wennborg// Test that -Wformat=0 works: 4c8769460f1c03bc321b00f5611f9965e8385e64dHans Wennborg// RUN: %clang_cc1 -fsyntax-only -Werror -Wformat=0 %s 5c8769460f1c03bc321b00f5611f9965e8385e64dHans Wennborg 6439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborg#include <stdarg.h> 71e4c33a677ba085bbbbfff211719ae4bb571c5b1Ted Kremenektypedef __typeof(sizeof(int)) size_t; 81e4c33a677ba085bbbbfff211719ae4bb571c5b1Ted Kremenektypedef struct _FILE FILE; 91e51c200b17cb6b0238c10a8760ae04765688f16Ted Kremenektypedef __WCHAR_TYPE__ wchar_t; 101e4c33a677ba085bbbbfff211719ae4bb571c5b1Ted Kremenek 111e4c33a677ba085bbbbfff211719ae4bb571c5b1Ted Kremenekint fscanf(FILE * restrict, const char * restrict, ...) ; 121e4c33a677ba085bbbbfff211719ae4bb571c5b1Ted Kremenekint scanf(const char * restrict, ...) ; 13d95a8ab030fd2e6daec901f3d0be8c7bb2b7c941Hans Wennborgint sscanf(const char * restrict, const char * restrict, ...) ; 14439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborgint my_scanf(const char * restrict, ...) __attribute__((__format__(__scanf__, 1, 2))); 15439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborg 16439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborgint vscanf(const char * restrict, va_list); 17439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborgint vfscanf(FILE * restrict, const char * restrict, va_list); 18c08e618f990e3a01a86ee221df73268a66664be8Hans Wennborgint vsscanf(const char * restrict, const char * restrict, va_list); 191e4c33a677ba085bbbbfff211719ae4bb571c5b1Ted Kremenek 201e4c33a677ba085bbbbfff211719ae4bb571c5b1Ted Kremenekvoid test(const char *s, int *i) { 211e4c33a677ba085bbbbfff211719ae4bb571c5b1Ted Kremenek scanf(s, i); // expected-warning{{ormat string is not a string literal}} 2232d0900b21505284287864267332dbff1f646868Ted Kremenek scanf("%0d", i); // expected-warning{{zero field width in scanf format string is unused}} 2332d0900b21505284287864267332dbff1f646868Ted Kremenek scanf("%00d", i); // expected-warning{{zero field width in scanf format string is unused}} 24bb09d1e7b2ce1d59e571397e8300d9e18cba8456Ted Kremenek scanf("%d%[asdfasdfd", i, s); // expected-warning{{no closing ']' for '%[' in scanf format string}} 25be86ecc82772546d9e404a32002e446ac0c725d9Ted Kremenek 26be86ecc82772546d9e404a32002e446ac0c725d9Ted Kremenek unsigned short s_x; 27be86ecc82772546d9e404a32002e446ac0c725d9Ted Kremenek scanf ("%" "hu" "\n", &s_x); // no-warning 28c09b6a59e02ae265fce51b8c11e2a045bcdaa888Ted Kremenek scanf("%y", i); // expected-warning{{invalid conversion specifier 'y'}} 29baa400654bd6f8396f9a07188445ae7955b060a3Ted Kremenek scanf("%%"); // no-warning 30baa400654bd6f8396f9a07188445ae7955b060a3Ted Kremenek scanf("%%%1$d", i); // no-warning 31baa400654bd6f8396f9a07188445ae7955b060a3Ted Kremenek scanf("%1$d%%", i); // no-warning 32baa400654bd6f8396f9a07188445ae7955b060a3Ted Kremenek scanf("%d", i, i); // expected-warning{{data argument not used by format string}} 33baa400654bd6f8396f9a07188445ae7955b060a3Ted Kremenek scanf("%*d", i); // // expected-warning{{data argument not used by format string}} 34baa400654bd6f8396f9a07188445ae7955b060a3Ted Kremenek scanf("%*d", i); // // expected-warning{{data argument not used by format string}} 35baa400654bd6f8396f9a07188445ae7955b060a3Ted Kremenek scanf("%*d%1$d", i); // no-warning 3658e1e54476d610d6c33ef483f216ed8a1282d35cHans Wennborg 3758e1e54476d610d6c33ef483f216ed8a1282d35cHans Wennborg scanf("%s", (char*)0); // no-warning 3858e1e54476d610d6c33ef483f216ed8a1282d35cHans Wennborg scanf("%s", (volatile char*)0); // no-warning 3958e1e54476d610d6c33ef483f216ed8a1282d35cHans Wennborg scanf("%s", (signed char*)0); // no-warning 4058e1e54476d610d6c33ef483f216ed8a1282d35cHans Wennborg scanf("%s", (unsigned char*)0); // no-warning 4158e1e54476d610d6c33ef483f216ed8a1282d35cHans Wennborg scanf("%hhu", (signed char*)0); // no-warning 421e4c33a677ba085bbbbfff211719ae4bb571c5b1Ted Kremenek} 431e51c200b17cb6b0238c10a8760ae04765688f16Ted Kremenek 441e51c200b17cb6b0238c10a8760ae04765688f16Ted Kremenekvoid bad_length_modifiers(char *s, void *p, wchar_t *ws, long double *ld) { 451e51c200b17cb6b0238c10a8760ae04765688f16Ted Kremenek scanf("%hhs", "foo"); // expected-warning{{length modifier 'hh' results in undefined behavior or no effect with 's' conversion specifier}} 466fcd932dfd6835f70cc00d6f7c6789793f6d7b66Hans Wennborg scanf("%1$zp", &p); // expected-warning{{length modifier 'z' results in undefined behavior or no effect with 'p' conversion specifier}} 471e51c200b17cb6b0238c10a8760ae04765688f16Ted Kremenek scanf("%ls", ws); // no-warning 481e51c200b17cb6b0238c10a8760ae04765688f16Ted Kremenek scanf("%#.2Lf", ld); // expected-warning{{invalid conversion specifier '#'}} 491e51c200b17cb6b0238c10a8760ae04765688f16Ted Kremenek} 5055733de16f492dadbf5f4d2809d6c610ba6d86aeRichard Trieu 5155733de16f492dadbf5f4d2809d6c610ba6d86aeRichard Trieu// Test that the scanf call site is where the warning is attached. If the 5255733de16f492dadbf5f4d2809d6c610ba6d86aeRichard Trieu// format string is somewhere else, point to it in a note. 5355733de16f492dadbf5f4d2809d6c610ba6d86aeRichard Trieuvoid pr9751() { 5455733de16f492dadbf5f4d2809d6c610ba6d86aeRichard Trieu int *i; 556fcd932dfd6835f70cc00d6f7c6789793f6d7b66Hans Wennborg char str[100]; 5655733de16f492dadbf5f4d2809d6c610ba6d86aeRichard Trieu const char kFormat1[] = "%00d"; // expected-note{{format string is defined here}}} 5755733de16f492dadbf5f4d2809d6c610ba6d86aeRichard Trieu scanf(kFormat1, i); // expected-warning{{zero field width in scanf format string is unused}} 5855733de16f492dadbf5f4d2809d6c610ba6d86aeRichard Trieu scanf("%00d", i); // expected-warning{{zero field width in scanf format string is unused}} 5955733de16f492dadbf5f4d2809d6c610ba6d86aeRichard Trieu const char kFormat2[] = "%["; // expected-note{{format string is defined here}}} 606fcd932dfd6835f70cc00d6f7c6789793f6d7b66Hans Wennborg scanf(kFormat2, str); // expected-warning{{no closing ']' for '%[' in scanf format string}} 616fcd932dfd6835f70cc00d6f7c6789793f6d7b66Hans Wennborg scanf("%[", str); // expected-warning{{no closing ']' for '%[' in scanf format string}} 62220947bd5a66b0f25f5e74d6029769dfb34f07b4Jean-Daniel Dupas const char kFormat3[] = "%hu"; // expected-note{{format string is defined here}}} 63220947bd5a66b0f25f5e74d6029769dfb34f07b4Jean-Daniel Dupas scanf(kFormat3, &i); // expected-warning {{format specifies type 'unsigned short *' but the argument}} 64220947bd5a66b0f25f5e74d6029769dfb34f07b4Jean-Daniel Dupas const char kFormat4[] = "%lp"; // expected-note{{format string is defined here}}} 65220947bd5a66b0f25f5e74d6029769dfb34f07b4Jean-Daniel Dupas scanf(kFormat4, &i); // expected-warning {{length modifier 'l' results in undefined behavior or no effect with 'p' conversion specifier}} 6655733de16f492dadbf5f4d2809d6c610ba6d86aeRichard Trieu} 67439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborg 68439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborgvoid test_variants(int *i, const char *s, ...) { 69439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborg FILE *f = 0; 70439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborg char buf[100]; 71439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborg 72ce506ae231703a23ea95335cd4de19c60082f361Ted Kremenek fscanf(f, "%ld", i); // expected-warning{{format specifies type 'long *' but the argument has type 'int *'}} 73ce506ae231703a23ea95335cd4de19c60082f361Ted Kremenek sscanf(buf, "%ld", i); // expected-warning{{format specifies type 'long *' but the argument has type 'int *'}} 74ce506ae231703a23ea95335cd4de19c60082f361Ted Kremenek my_scanf("%ld", i); // expected-warning{{format specifies type 'long *' but the argument has type 'int *'}} 75439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborg 76439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborg va_list ap; 77439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborg va_start(ap, s); 78439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborg 79439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborg vscanf("%[abc", ap); // expected-warning{{no closing ']' for '%[' in scanf format string}} 80439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborg vfscanf(f, "%[abc", ap); // expected-warning{{no closing ']' for '%[' in scanf format string}} 81439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborg vsscanf(buf, "%[abc", ap); // expected-warning{{no closing ']' for '%[' in scanf format string}} 82439ddaada2df048ecad2c0ba1934f8a890812618Hans Wennborg} 83d02deebce5f1b283101e035a7f5d5bab0d2068ecHans Wennborg 84ef1440b6eca118d46291166ce3302f9bba8e639bTed Kremenekvoid test_scanlist(int *ip, char *sp, wchar_t *ls) { 85ce506ae231703a23ea95335cd4de19c60082f361Ted Kremenek scanf("%[abc]", ip); // expected-warning{{format specifies type 'char *' but the argument has type 'int *'}} 8628058d179ae40edc66135458849f1073c841bc74Hans Wennborg scanf("%h[abc]", sp); // expected-warning{{length modifier 'h' results in undefined behavior or no effect with '[' conversion specifier}} 87ef1440b6eca118d46291166ce3302f9bba8e639bTed Kremenek scanf("%l[xyx]", ls); // no-warning 88ef1440b6eca118d46291166ce3302f9bba8e639bTed Kremenek scanf("%ll[xyx]", ls); // expected-warning {{length modifier 'll' results in undefined behavior or no effect with '[' conversion specifier}} 896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // PR19559 916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines scanf("%[]% ]", sp); // no-warning 926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines scanf("%[^]% ]", sp); // no-warning 936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines scanf("%[a^]% ]", sp); // expected-warning {{invalid conversion specifier ' '}} 946de0b48c5531cfe7370e1a9eeaed0566fa65dc9bHans Wennborg} 956de0b48c5531cfe7370e1a9eeaed0566fa65dc9bHans Wennborg 9637969b7e14d6a4dfd934ef6d3738cc90b832ec1dHans Wennborgvoid test_alloc_extension(char **sp, wchar_t **lsp, float *fp) { 97d02deebce5f1b283101e035a7f5d5bab0d2068ecHans Wennborg /* Make sure "%a" gets parsed as a conversion specifier for float, 98d02deebce5f1b283101e035a7f5d5bab0d2068ecHans Wennborg * even when followed by an 's', 'S' or '[', which would cause it to be 99d02deebce5f1b283101e035a7f5d5bab0d2068ecHans Wennborg * parsed as a length modifier in C90. */ 100ce506ae231703a23ea95335cd4de19c60082f361Ted Kremenek scanf("%as", sp); // expected-warning{{format specifies type 'float *' but the argument has type 'char **'}} 101ce506ae231703a23ea95335cd4de19c60082f361Ted Kremenek scanf("%aS", lsp); // expected-warning{{format specifies type 'float *' but the argument has type 'wchar_t **'}} 102ce506ae231703a23ea95335cd4de19c60082f361Ted Kremenek scanf("%a[bcd]", sp); // expected-warning{{format specifies type 'float *' but the argument has type 'char **'}} 10337969b7e14d6a4dfd934ef6d3738cc90b832ec1dHans Wennborg 10437969b7e14d6a4dfd934ef6d3738cc90b832ec1dHans Wennborg // Test that the 'm' length modifier is only allowed with s, S, c, C or [. 10537969b7e14d6a4dfd934ef6d3738cc90b832ec1dHans Wennborg // TODO: Warn that 'm' is an extension. 10637969b7e14d6a4dfd934ef6d3738cc90b832ec1dHans Wennborg scanf("%ms", sp); // No warning. 10737969b7e14d6a4dfd934ef6d3738cc90b832ec1dHans Wennborg scanf("%mS", lsp); // No warning. 10837969b7e14d6a4dfd934ef6d3738cc90b832ec1dHans Wennborg scanf("%mc", sp); // No warning. 10937969b7e14d6a4dfd934ef6d3738cc90b832ec1dHans Wennborg scanf("%mC", lsp); // No warning. 11037969b7e14d6a4dfd934ef6d3738cc90b832ec1dHans Wennborg scanf("%m[abc]", sp); // No warning. 11137969b7e14d6a4dfd934ef6d3738cc90b832ec1dHans Wennborg scanf("%md", sp); // expected-warning{{length modifier 'm' results in undefined behavior or no effect with 'd' conversion specifier}} 11237969b7e14d6a4dfd934ef6d3738cc90b832ec1dHans Wennborg 11337969b7e14d6a4dfd934ef6d3738cc90b832ec1dHans Wennborg // Test argument type check for the 'm' length modifier. 114ce506ae231703a23ea95335cd4de19c60082f361Ted Kremenek scanf("%ms", fp); // expected-warning{{format specifies type 'char **' but the argument has type 'float *'}} 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines scanf("%mS", fp); // expected-warning-re{{format specifies type 'wchar_t **' (aka '{{[^']+}}') but the argument has type 'float *'}} 116ce506ae231703a23ea95335cd4de19c60082f361Ted Kremenek scanf("%mc", fp); // expected-warning{{format specifies type 'char **' but the argument has type 'float *'}} 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines scanf("%mC", fp); // expected-warning-re{{format specifies type 'wchar_t **' (aka '{{[^']+}}') but the argument has type 'float *'}} 118ce506ae231703a23ea95335cd4de19c60082f361Ted Kremenek scanf("%m[abc]", fp); // expected-warning{{format specifies type 'char **' but the argument has type 'float *'}} 119d02deebce5f1b283101e035a7f5d5bab0d2068ecHans Wennborg} 120ef1440b6eca118d46291166ce3302f9bba8e639bTed Kremenek 12132addd519c6699000ff79c387a1c87f0ab7c3698Hans Wennborgvoid test_quad(int *x, long long *llx) { 12232addd519c6699000ff79c387a1c87f0ab7c3698Hans Wennborg scanf("%qd", x); // expected-warning{{format specifies type 'long long *' but the argument has type 'int *'}} 12332addd519c6699000ff79c387a1c87f0ab7c3698Hans Wennborg scanf("%qd", llx); // no-warning 12432addd519c6699000ff79c387a1c87f0ab7c3698Hans Wennborg} 125cec9ce49dcf4b4b768043f96c8ef8c1d4cdbb6b9Hans Wennborg 126cec9ce49dcf4b4b768043f96c8ef8c1d4cdbb6b9Hans Wennborgvoid test_writeback(int *x) { 127cec9ce49dcf4b4b768043f96c8ef8c1d4cdbb6b9Hans Wennborg scanf("%n", (void*)0); // expected-warning{{format specifies type 'int *' but the argument has type 'void *'}} 128cec9ce49dcf4b4b768043f96c8ef8c1d4cdbb6b9Hans Wennborg scanf("%n %c", x, x); // expected-warning{{format specifies type 'char *' but the argument has type 'int *'}} 129f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg 130f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%hhn", (signed char*)0); // no-warning 131f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%hhn", (char*)0); // no-warning 132f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%hhn", (unsigned char*)0); // no-warning 133f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%hhn", (int*)0); // expected-warning{{format specifies type 'signed char *' but the argument has type 'int *'}} 134f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg 135f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%hn", (short*)0); // no-warning 136f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%hn", (unsigned short*)0); // no-warning 137f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%hn", (int*)0); // expected-warning{{format specifies type 'short *' but the argument has type 'int *'}} 138f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg 139f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%n", (int*)0); // no-warning 140f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%n", (unsigned int*)0); // no-warning 141f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%n", (char*)0); // expected-warning{{format specifies type 'int *' but the argument has type 'char *'}} 142f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg 143f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%ln", (long*)0); // no-warning 144f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%ln", (unsigned long*)0); // no-warning 145f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%ln", (int*)0); // expected-warning{{format specifies type 'long *' but the argument has type 'int *'}} 146f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg 147f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%lln", (long long*)0); // no-warning 148f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%lln", (unsigned long long*)0); // no-warning 149f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%lln", (int*)0); // expected-warning{{format specifies type 'long long *' but the argument has type 'int *'}} 150f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg 151f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%qn", (long long*)0); // no-warning 152f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%qn", (unsigned long long*)0); // no-warning 153f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg scanf("%qn", (int*)0); // expected-warning{{format specifies type 'long long *' but the argument has type 'int *'}} 154f7158fa034174d2756736d1032b75d01d9deeb4cHans Wennborg 155cec9ce49dcf4b4b768043f96c8ef8c1d4cdbb6b9Hans Wennborg} 1565deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg 1575deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborgvoid test_qualifiers(const int *cip, volatile int* vip, 1585deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg const char *ccp, volatile char* vcp, 1595deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg const volatile int *cvip) { 1605deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg scanf("%d", cip); // expected-warning{{format specifies type 'int *' but the argument has type 'const int *'}} 1615deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg scanf("%n", cip); // expected-warning{{format specifies type 'int *' but the argument has type 'const int *'}} 1625deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg scanf("%s", ccp); // expected-warning{{format specifies type 'char *' but the argument has type 'const char *'}} 1635deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg scanf("%d", cvip); // expected-warning{{format specifies type 'int *' but the argument has type 'const volatile int *'}} 1645deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg 1655deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg scanf("%d", vip); // No warning. 1665deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg scanf("%n", vip); // No warning. 1675deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg scanf("%c", vcp); // No warning. 1685deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg 1695deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg typedef int* ip_t; 1705deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg typedef const int* cip_t; 1715deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg scanf("%d", (ip_t)0); // No warning. 1725deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg scanf("%d", (cip_t)0); // expected-warning{{format specifies type 'int *' but the argument has type 'cip_t' (aka 'const int *')}} 1735deddafd3ef51e94b4ac4d80e38271d3768b1af6Hans Wennborg} 174