1*67e74705SXin Li// RUN: %clang_cc1 -Wcstring-format-directive -verify -fsyntax-only %s 2*67e74705SXin Li// rdar://18182443 3*67e74705SXin Li 4*67e74705SXin Litypedef __builtin_va_list __darwin_va_list; 5*67e74705SXin Litypedef __builtin_va_list va_list; 6*67e74705SXin Li 7*67e74705SXin Li@interface NSString 8*67e74705SXin Li@end 9*67e74705SXin Li 10*67e74705SXin Liva_list argList; 11*67e74705SXin Li 12*67e74705SXin Li@interface NSString (NSStringExtensionMethods) 13*67e74705SXin Li- (NSString *)stringByAppendingFormat:(NSString *)format, ... __attribute__((format(__NSString__, 1, 2))); 14*67e74705SXin Li- (instancetype)initWithFormat:(NSString *)format, ... __attribute__((format(__NSString__, 1, 2))); // expected-note 2 {{method 'initWithFormat:' declared here}} 15*67e74705SXin Li- (instancetype)initWithFormat:(NSString *)format arguments:(va_list)argList __attribute__((format(__NSString__, 1, 0))); 16*67e74705SXin Li- (instancetype)initWithFormat:(NSString *)format locale:(id)locale, ... __attribute__((format(__NSString__, 1, 3))); 17*67e74705SXin Li- (instancetype)initWithFormat:(NSString *)format locale:(id)locale arguments:(va_list)argList __attribute__((format(__NSString__, 1, 0))); 18*67e74705SXin Li+ (instancetype)stringWithFormat:(NSString *)format, ... __attribute__((format(__NSString__, 1, 2))); // expected-note {{method 'stringWithFormat:' declared here}} 19*67e74705SXin Li+ (instancetype)localizedStringWithFormat:(NSString *)format, ... __attribute__((format(__NSString__, 1, 2))); // expected-note {{method 'localizedStringWithFormat:' declared here}} 20*67e74705SXin Li- (void)MyRandomMethod:(NSString *)format locale:(id)locale arguments:(va_list)argList __attribute__((format(__NSString__, 1, 0))); // expected-note {{method 'MyRandomMethod:locale:arguments:' declared here}} 21*67e74705SXin Li@end 22*67e74705SXin Li 23*67e74705SXin Li@interface NSMutableString : NSString 24*67e74705SXin Li@end 25*67e74705SXin Li 26*67e74705SXin Li@interface NSMutableString (NSMutableStringExtensionMethods) 27*67e74705SXin Li 28*67e74705SXin Li- (void)appendFormat:(NSString *)format, ... __attribute__((format(__NSString__, 1, 2))); 29*67e74705SXin Li 30*67e74705SXin Li@end 31*67e74705SXin Li 32*67e74705SXin LiNSString *ns(NSString *pns) { 33*67e74705SXin Li [pns initWithFormat: @"Number %d length %c name %s", 1, 'a', "something"]; // expected-warning {{using %s directive in NSString which is being passed as a formatting argument to the formatting method}} 34*67e74705SXin Li [NSString localizedStringWithFormat : @"Hello%s", " There"]; // expected-warning {{using %s directive in NSString which is being passed as a formatting argument to the formatting method}} 35*67e74705SXin Li [pns initWithFormat : @"Hello%s %d %d", "Hello", 1, 2]; // expected-warning {{using %s directive in NSString which is being passed as a formatting argument to the formatting method}} 36*67e74705SXin Li [pns MyRandomMethod : @"Hello%s %d %d" locale:0 arguments: argList]; // expected-warning {{using %s directive in NSString which is being passed as a formatting argument to the formatting method}} 37*67e74705SXin Li return [NSString stringWithFormat : @"Hello%s", " There"]; // expected-warning {{using %s directive in NSString which is being passed as a formatting argument to the formatting method}} 38*67e74705SXin Li} 39*67e74705SXin Li 40*67e74705SXin Li 41*67e74705SXin Litypedef const struct __CFString * CFStringRef; 42*67e74705SXin Litypedef struct __CFString * CFMutableStringRef; 43*67e74705SXin Litypedef const struct __CFAllocator * CFAllocatorRef; 44*67e74705SXin Li 45*67e74705SXin Li 46*67e74705SXin Litypedef const struct __CFDictionary * CFDictionaryRef; 47*67e74705SXin Li 48*67e74705SXin Li 49*67e74705SXin Liextern 50*67e74705SXin LiCFStringRef CFStringCreateWithFormat(CFAllocatorRef alloc, CFDictionaryRef formatOptions, CFStringRef format, ...) __attribute__((format(CFString, 3, 4))); 51*67e74705SXin Li 52*67e74705SXin Liextern 53*67e74705SXin LiCFStringRef CFStringCreateWithFormatAndArguments(CFAllocatorRef alloc, CFDictionaryRef formatOptions, CFStringRef format, va_list arguments) __attribute__((format(CFString, 3, 0))); // expected-note {{'CFStringCreateWithFormatAndArguments' declared here}} 54*67e74705SXin Li 55*67e74705SXin Liextern 56*67e74705SXin Livoid CFStringAppendFormat(CFMutableStringRef theString, CFDictionaryRef formatOptions, CFStringRef format, ...) __attribute__((format(CFString, 3, 4))); 57*67e74705SXin Li 58*67e74705SXin Liextern 59*67e74705SXin Livoid CFStringAppendFormatAndArguments(CFMutableStringRef theString, CFDictionaryRef formatOptions, CFStringRef format, va_list arguments) __attribute__((format(CFString, 3, 0))); // expected-note {{'CFStringAppendFormatAndArguments' declared here}} 60*67e74705SXin Li 61*67e74705SXin Livoid Test1(va_list argList) { 62*67e74705SXin Li CFAllocatorRef alloc; 63*67e74705SXin Li CFStringCreateWithFormatAndArguments (alloc, 0, (CFStringRef)@"%s\n", argList); // expected-warning {{using %s directive in CFString which is being passed as a formatting argument to the formatting CFfunction}} 64*67e74705SXin Li CFStringAppendFormatAndArguments ((CFMutableStringRef)@"AAAA", 0, (CFStringRef)"Hello %s there %d\n", argList); // expected-warning {{using %s directive in CFString which is being passed as a formatting argument to the formatting CFfunction}} 65*67e74705SXin Li CFStringCreateWithFormatAndArguments (alloc, 0, (CFStringRef)@"%c\n", argList); 66*67e74705SXin Li CFStringAppendFormatAndArguments ((CFMutableStringRef)@"AAAA", 0, (CFStringRef)"%d\n", argList); 67*67e74705SXin Li} 68*67e74705SXin Li 69*67e74705SXin Liextern void MyNSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2))); // expected-note {{'MyNSLog' declared here}} 70*67e74705SXin Liextern void MyCFStringCreateWithFormat(CFStringRef format, ...) __attribute__((format(__CFString__, 1, 2))); // expected-note {{'MyCFStringCreateWithFormat' declared here}} 71*67e74705SXin Liextern void XMyNSLog(int, NSString *format, ...) __attribute__((format(__NSString__, 2, 3))); // expected-note {{'XMyNSLog' declared here}} 72*67e74705SXin Li 73*67e74705SXin Livoid Test2() { 74*67e74705SXin Li MyNSLog(@"%s\n", "Hello"); // expected-warning {{using %s directive in CFString which is being passed as a formatting argument to the formatting CFfunction}} 75*67e74705SXin Li 76*67e74705SXin Li MyCFStringCreateWithFormat((CFStringRef)@"%s", "Hello"); // expected-warning {{using %s directive in CFString which is being passed as a formatting argument to the formatting CFfunction}} 77*67e74705SXin Li XMyNSLog(4, @"%s\n", "Hello"); // expected-warning {{using %s directive in CFString which is being passed as a formatting argument to the formatting CFfunction}} 78*67e74705SXin Li} 79*67e74705SXin Li 80