xref: /aosp_15_r20/external/clang/test/Analysis/inlining/false-positive-suppression.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
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