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