xref: /aosp_15_r20/external/clang/test/SemaObjC/format-cstrings-warning.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
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