1*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config suppress-null-return-paths=false -verify %s 2*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=core -verify -DSUPPRESSED=1 %s 3*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config avoid-suppressing-null-argument-paths=true -DSUPPRESSED=1 -DNULL_ARGS=1 -verify %s 4*67e74705SXin Li 5*67e74705SXin Li#ifdef SUPPRESSED 6*67e74705SXin Li// expected-no-diagnostics 7*67e74705SXin Li#endif 8*67e74705SXin Li 9*67e74705SXin Li@interface PointerWrapper 10*67e74705SXin Li- (int *)getPtr; 11*67e74705SXin Li- (id)getObject; 12*67e74705SXin Li@end 13*67e74705SXin Li 14*67e74705SXin Liid getNil() { 15*67e74705SXin Li return 0; 16*67e74705SXin Li} 17*67e74705SXin Li 18*67e74705SXin Livoid testNilReceiverHelperA(int *x) { 19*67e74705SXin Li *x = 1; 20*67e74705SXin Li#ifndef SUPPRESSED 21*67e74705SXin Li // expected-warning@-2 {{Dereference of null pointer}} 22*67e74705SXin Li#endif 23*67e74705SXin Li} 24*67e74705SXin Li 25*67e74705SXin Livoid testNilReceiverHelperB(int *x) { 26*67e74705SXin Li *x = 1; 27*67e74705SXin Li#ifndef SUPPRESSED 28*67e74705SXin Li // expected-warning@-2 {{Dereference of null pointer}} 29*67e74705SXin Li#endif 30*67e74705SXin Li} 31*67e74705SXin Li 32*67e74705SXin Livoid testNilReceiver(int coin) { 33*67e74705SXin Li id x = getNil(); 34*67e74705SXin Li if (coin) 35*67e74705SXin Li testNilReceiverHelperA([x getPtr]); 36*67e74705SXin Li else 37*67e74705SXin Li testNilReceiverHelperB([[x getObject] getPtr]); 38*67e74705SXin Li} 39*67e74705SXin Li 40*67e74705SXin Li// FALSE NEGATIVES (over-suppression) 41*67e74705SXin Li 42*67e74705SXin Li__attribute__((objc_root_class)) 43*67e74705SXin Li@interface SomeClass 44*67e74705SXin Li-(int *)methodReturningNull; 45*67e74705SXin Li 46*67e74705SXin Li@property(readonly) int *propertyReturningNull; 47*67e74705SXin Li 48*67e74705SXin Li@property(readonly) int *synthesizedProperty; 49*67e74705SXin Li 50*67e74705SXin Li@end 51*67e74705SXin Li 52*67e74705SXin Li@interface SubOfSomeClass : SomeClass 53*67e74705SXin Li@end 54*67e74705SXin Li 55*67e74705SXin Li@implementation SubOfSomeClass 56*67e74705SXin Li@end 57*67e74705SXin Li 58*67e74705SXin Li@implementation SomeClass 59*67e74705SXin Li-(int *)methodReturningNull { 60*67e74705SXin Li return 0; 61*67e74705SXin Li} 62*67e74705SXin Li 63*67e74705SXin Li-(int *)propertyReturningNull { 64*67e74705SXin Li return 0; 65*67e74705SXin Li} 66*67e74705SXin Li 67*67e74705SXin Li+(int *)classPropertyReturningNull { 68*67e74705SXin Li return 0; 69*67e74705SXin Li} 70*67e74705SXin Li@end 71*67e74705SXin Li 72*67e74705SXin Livoid testMethodReturningNull(SomeClass *sc) { 73*67e74705SXin Li int *result = [sc methodReturningNull]; 74*67e74705SXin Li *result = 1; 75*67e74705SXin Li#ifndef SUPPRESSED 76*67e74705SXin Li // expected-warning@-2 {{Dereference of null pointer}} 77*67e74705SXin Li#endif 78*67e74705SXin Li} 79*67e74705SXin Li 80*67e74705SXin Livoid testPropertyReturningNull(SomeClass *sc) { 81*67e74705SXin Li int *result = sc.propertyReturningNull; 82*67e74705SXin Li *result = 1; 83*67e74705SXin Li#ifndef SUPPRESSED 84*67e74705SXin Li // expected-warning@-2 {{Dereference of null pointer}} 85*67e74705SXin Li#endif 86*67e74705SXin Li} 87*67e74705SXin Li 88*67e74705SXin Li@implementation SubOfSomeClass (ForTestOfSuperProperty) 89*67e74705SXin Li-(void)testSuperPropertyReturningNull { 90*67e74705SXin Li int *result = super.propertyReturningNull; 91*67e74705SXin Li *result = 1; 92*67e74705SXin Li#ifndef SUPPRESSED 93*67e74705SXin Li // expected-warning@-2 {{Dereference of null pointer}} 94*67e74705SXin Li#endif 95*67e74705SXin Li} 96*67e74705SXin Li@end 97*67e74705SXin Li 98*67e74705SXin Livoid testClassPropertyReturningNull() { 99*67e74705SXin Li int *result = SomeClass.classPropertyReturningNull; 100*67e74705SXin Li *result = 1; 101*67e74705SXin Li#ifndef SUPPRESSED 102*67e74705SXin Li // expected-warning@-2 {{Dereference of null pointer}} 103*67e74705SXin Li#endif 104*67e74705SXin Li} 105*67e74705SXin Li 106*67e74705SXin Livoid testSynthesizedPropertyReturningNull(SomeClass *sc) { 107*67e74705SXin Li if (sc.synthesizedProperty) 108*67e74705SXin Li return; 109*67e74705SXin Li 110*67e74705SXin Li int *result = sc.synthesizedProperty; 111*67e74705SXin Li *result = 1; 112*67e74705SXin Li#ifndef SUPPRESSED 113*67e74705SXin Li // expected-warning@-2 {{Dereference of null pointer}} 114*67e74705SXin Li#endif 115*67e74705SXin Li} 116