// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config suppress-null-return-paths=false -verify %s // RUN: %clang_cc1 -analyze -analyzer-checker=core -verify -DSUPPRESSED=1 %s // RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config avoid-suppressing-null-argument-paths=true -DSUPPRESSED=1 -DNULL_ARGS=1 -verify %s #ifdef SUPPRESSED // expected-no-diagnostics #endif @interface PointerWrapper - (int *)getPtr; - (id)getObject; @end id getNil() { return 0; } void testNilReceiverHelperA(int *x) { *x = 1; #ifndef SUPPRESSED // expected-warning@-2 {{Dereference of null pointer}} #endif } void testNilReceiverHelperB(int *x) { *x = 1; #ifndef SUPPRESSED // expected-warning@-2 {{Dereference of null pointer}} #endif } void testNilReceiver(int coin) { id x = getNil(); if (coin) testNilReceiverHelperA([x getPtr]); else testNilReceiverHelperB([[x getObject] getPtr]); } // FALSE NEGATIVES (over-suppression) __attribute__((objc_root_class)) @interface SomeClass -(int *)methodReturningNull; @property(readonly) int *propertyReturningNull; @property(readonly) int *synthesizedProperty; @end @interface SubOfSomeClass : SomeClass @end @implementation SubOfSomeClass @end @implementation SomeClass -(int *)methodReturningNull { return 0; } -(int *)propertyReturningNull { return 0; } +(int *)classPropertyReturningNull { return 0; } @end void testMethodReturningNull(SomeClass *sc) { int *result = [sc methodReturningNull]; *result = 1; #ifndef SUPPRESSED // expected-warning@-2 {{Dereference of null pointer}} #endif } void testPropertyReturningNull(SomeClass *sc) { int *result = sc.propertyReturningNull; *result = 1; #ifndef SUPPRESSED // expected-warning@-2 {{Dereference of null pointer}} #endif } @implementation SubOfSomeClass (ForTestOfSuperProperty) -(void)testSuperPropertyReturningNull { int *result = super.propertyReturningNull; *result = 1; #ifndef SUPPRESSED // expected-warning@-2 {{Dereference of null pointer}} #endif } @end void testClassPropertyReturningNull() { int *result = SomeClass.classPropertyReturningNull; *result = 1; #ifndef SUPPRESSED // expected-warning@-2 {{Dereference of null pointer}} #endif } void testSynthesizedPropertyReturningNull(SomeClass *sc) { if (sc.synthesizedProperty) return; int *result = sc.synthesizedProperty; *result = 1; #ifndef SUPPRESSED // expected-warning@-2 {{Dereference of null pointer}} #endif }