xref: /aosp_15_r20/external/clang/test/Analysis/objc-boxing.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -Wno-objc-literal-conversion -analyze -analyzer-checker=core,unix.Malloc,osx.cocoa.NonNilReturnValue,debug.ExprInspection -analyzer-store=region -verify %s
2*67e74705SXin Li
3*67e74705SXin Livoid clang_analyzer_eval(int);
4*67e74705SXin Li
5*67e74705SXin Litypedef signed char BOOL;
6*67e74705SXin Litypedef long NSInteger;
7*67e74705SXin Litypedef unsigned long NSUInteger;
8*67e74705SXin Li@interface NSString @end
9*67e74705SXin Li@interface NSString (NSStringExtensionMethods)
10*67e74705SXin Li+ (id)stringWithUTF8String:(const char *)nullTerminatedCString;
11*67e74705SXin Li@end
12*67e74705SXin Li
13*67e74705SXin Li@interface NSNumber
14*67e74705SXin Li+ (NSNumber *)numberWithChar:(char)value;
15*67e74705SXin Li+ (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
16*67e74705SXin Li+ (NSNumber *)numberWithShort:(short)value;
17*67e74705SXin Li+ (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
18*67e74705SXin Li+ (NSNumber *)numberWithInt:(int)value;
19*67e74705SXin Li+ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
20*67e74705SXin Li+ (NSNumber *)numberWithLong:(long)value;
21*67e74705SXin Li+ (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
22*67e74705SXin Li+ (NSNumber *)numberWithLongLong:(long long)value;
23*67e74705SXin Li+ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
24*67e74705SXin Li+ (NSNumber *)numberWithFloat:(float)value;
25*67e74705SXin Li+ (NSNumber *)numberWithDouble:(double)value;
26*67e74705SXin Li+ (NSNumber *)numberWithBool:(BOOL)value;
27*67e74705SXin Li+ (NSNumber *)numberWithInteger:(NSInteger)value ;
28*67e74705SXin Li+ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value ;
29*67e74705SXin Li@end
30*67e74705SXin Li
31*67e74705SXin Li
32*67e74705SXin Liextern char *strdup(const char *str);
33*67e74705SXin Li
34*67e74705SXin Liid constant_string() {
35*67e74705SXin Li    return @("boxed constant string.");
36*67e74705SXin Li}
37*67e74705SXin Li
38*67e74705SXin Liid dynamic_string() {
39*67e74705SXin Li    return @(strdup("boxed dynamic string")); // expected-warning{{Potential memory leak}}
40*67e74705SXin Li}
41*67e74705SXin Li
42*67e74705SXin Liid const_char_pointer(int *x) {
43*67e74705SXin Li  if (x)
44*67e74705SXin Li    return @(3);
45*67e74705SXin Li  return @(*x); // expected-warning {{Dereference of null pointer (loaded from variable 'x')}}
46*67e74705SXin Li}
47*67e74705SXin Li
48*67e74705SXin Livoid checkNonNil() {
49*67e74705SXin Li  clang_analyzer_eval(!!@3); // expected-warning{{TRUE}}
50*67e74705SXin Li  clang_analyzer_eval(!!@(3+4)); // expected-warning{{TRUE}}
51*67e74705SXin Li  clang_analyzer_eval(!!@(57.0)); // expected-warning{{TRUE}}
52*67e74705SXin Li
53*67e74705SXin Li  const char *str = "abc";
54*67e74705SXin Li  clang_analyzer_eval(!!@(str)); // expected-warning{{TRUE}}
55*67e74705SXin Li  clang_analyzer_eval(!!@__objc_yes); // expected-warning{{TRUE}}
56*67e74705SXin Li}
57*67e74705SXin Li
58