1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
// RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-config suppress-null-return-paths=false -verify %s
// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify -DSUPPRESSED=1 %s
// RUN: %clang_analyze_cc1 -analyzer-checker=core -fobjc-arc -verify -DSUPPRESSED=1 %s
// RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-config avoid-suppressing-null-argument-paths=true -DSUPPRESSED=1 -DNULL_ARGS=1 -verify %s
#define ARC __has_feature(objc_arc)
#ifdef SUPPRESSED
// expected-no-diagnostics
#endif
@interface PointerWrapper
- (int *)getPtr;
- (id)getObject;
@end
id getNil(void) {
return 0;
}
void testNilReceiverHelperA(int *x) {
*x = 1;
#ifndef SUPPRESSED
// expected-warning@-2 {{Dereference of null pointer}}
#endif
}
void testNilReceiverHelperB(int *x) {
*x = 1;
#if !defined(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 ivar;
}
-(int *)methodReturningNull;
@property(readonly) int *propertyReturningNull;
@property(readonly) int *synthesizedProperty;
@property(readonly) SomeClass *propertyReturningNil;
@end
@interface SubOfSomeClass : SomeClass
@end
@implementation SubOfSomeClass
@end
@implementation SomeClass
-(int *)methodReturningNull {
return 0;
}
-(int *)propertyReturningNull {
return 0;
}
-(SomeClass *)propertyReturningNil {
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(void) {
int *result = SomeClass.classPropertyReturningNull;
*result = 1;
#ifndef SUPPRESSED
// expected-warning@-2 {{Dereference of null pointer}}
#endif
}
@implementation SomeClass (ForTestOfPropertyReturningNil)
void testPropertyReturningNil(SomeClass *sc) {
SomeClass *result = sc.propertyReturningNil;
result->ivar = 1;
#ifndef SUPPRESSED
// expected-warning@-2 {{Access to instance variable 'ivar' results in a dereference of a null pointer (loaded from variable 'result')}}
#endif
}
@end
void testSynthesizedPropertyReturningNull(SomeClass *sc) {
if (sc.synthesizedProperty)
return;
int *result = sc.synthesizedProperty;
*result = 1;
#ifndef SUPPRESSED
// expected-warning@-2 {{Dereference of null pointer}}
#endif
}
|