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