xref: /aosp_15_r20/external/clang/test/Analysis/global_region_invalidation.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s
2*67e74705SXin Li
3*67e74705SXin Livoid clang_analyzer_eval(int);
4*67e74705SXin Li
5*67e74705SXin Li#include "Inputs/system-header-simulator.h"
6*67e74705SXin Li
7*67e74705SXin Livoid use(int);
8*67e74705SXin Liid foo(int x) {
9*67e74705SXin Li  if (x)
10*67e74705SXin Li    return 0;
11*67e74705SXin Li  static id p = foo(1);
12*67e74705SXin Li    clang_analyzer_eval(p == 0); // expected-warning{{TRUE}}
13*67e74705SXin Li  return p;
14*67e74705SXin Li}
15*67e74705SXin Li
16*67e74705SXin Liconst int &globalIntRef = 42;
17*67e74705SXin Li
18*67e74705SXin Livoid testGlobalRef() {
19*67e74705SXin Li  // FIXME: Should be TRUE, but should at least not crash.
20*67e74705SXin Li  clang_analyzer_eval(globalIntRef == 42); // expected-warning{{UNKNOWN}}
21*67e74705SXin Li}
22*67e74705SXin Li
23*67e74705SXin Liextern int globalInt;
24*67e74705SXin Listruct IntWrapper {
25*67e74705SXin Li  int value;
26*67e74705SXin Li};
27*67e74705SXin Liextern struct IntWrapper globalStruct;
28*67e74705SXin Liextern void invalidateGlobals();
29*67e74705SXin Li
30*67e74705SXin Livoid testGlobalInvalidation() {
31*67e74705SXin Li  clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
32*67e74705SXin Li  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
33*67e74705SXin Li
34*67e74705SXin Li  if (globalInt != 42)
35*67e74705SXin Li    return;
36*67e74705SXin Li  if (globalStruct.value != 43)
37*67e74705SXin Li    return;
38*67e74705SXin Li  clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
39*67e74705SXin Li  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}
40*67e74705SXin Li
41*67e74705SXin Li  invalidateGlobals();
42*67e74705SXin Li  clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
43*67e74705SXin Li  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
44*67e74705SXin Li
45*67e74705SXin Li  // Repeat to make sure we don't get the /same/ new symbolic values.
46*67e74705SXin Li  if (globalInt != 42)
47*67e74705SXin Li    return;
48*67e74705SXin Li  if (globalStruct.value != 43)
49*67e74705SXin Li    return;
50*67e74705SXin Li  clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
51*67e74705SXin Li  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}
52*67e74705SXin Li
53*67e74705SXin Li  invalidateGlobals();
54*67e74705SXin Li  clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
55*67e74705SXin Li  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
56*67e74705SXin Li}
57*67e74705SXin Li
58*67e74705SXin Livoid testGlobalInvalidationWithDirectBinding() {
59*67e74705SXin Li  clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
60*67e74705SXin Li  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
61*67e74705SXin Li
62*67e74705SXin Li  globalInt = 42;
63*67e74705SXin Li  globalStruct.value = 43;
64*67e74705SXin Li  clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
65*67e74705SXin Li  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}
66*67e74705SXin Li
67*67e74705SXin Li  invalidateGlobals();
68*67e74705SXin Li  clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
69*67e74705SXin Li  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
70*67e74705SXin Li}
71*67e74705SXin Li
72*67e74705SXin Livoid testStaticLocals(void) {
73*67e74705SXin Li  static int i;
74*67e74705SXin Li  int tmp;
75*67e74705SXin Li
76*67e74705SXin Li  extern int someSymbolicValue();
77*67e74705SXin Li  i = someSymbolicValue();
78*67e74705SXin Li
79*67e74705SXin Li  if (i == 5) {
80*67e74705SXin Li    clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
81*67e74705SXin Li    scanf("%d", &tmp);
82*67e74705SXin Li    clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
83*67e74705SXin Li    invalidateGlobals();
84*67e74705SXin Li    clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
85*67e74705SXin Li  }
86*67e74705SXin Li
87*67e74705SXin Li  i = 6;
88*67e74705SXin Li  clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
89*67e74705SXin Li  scanf("%d", &tmp);
90*67e74705SXin Li  clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
91*67e74705SXin Li  invalidateGlobals();
92*67e74705SXin Li  clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
93*67e74705SXin Li
94*67e74705SXin Li  i = someSymbolicValue();
95*67e74705SXin Li  if (i == 7) {
96*67e74705SXin Li    clang_analyzer_eval(i == 7); // expected-warning{{TRUE}}
97*67e74705SXin Li    scanf("%d", &i);
98*67e74705SXin Li    clang_analyzer_eval(i == 7); // expected-warning{{UNKNOWN}}
99*67e74705SXin Li  }
100*67e74705SXin Li
101*67e74705SXin Li  i = 8;
102*67e74705SXin Li  clang_analyzer_eval(i == 8); // expected-warning{{TRUE}}
103*67e74705SXin Li  scanf("%d", &i);
104*67e74705SXin Li  clang_analyzer_eval(i == 8); // expected-warning{{UNKNOWN}}
105*67e74705SXin Li}
106*67e74705SXin Li
107*67e74705SXin Livoid testNonSystemGlobals(void) {
108*67e74705SXin Li  extern int i;
109*67e74705SXin Li  int tmp;
110*67e74705SXin Li
111*67e74705SXin Li  if (i == 5) {
112*67e74705SXin Li    clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
113*67e74705SXin Li    scanf("%d", &tmp);
114*67e74705SXin Li    clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
115*67e74705SXin Li    invalidateGlobals();
116*67e74705SXin Li    clang_analyzer_eval(i == 5); // expected-warning{{UNKNOWN}}
117*67e74705SXin Li  }
118*67e74705SXin Li
119*67e74705SXin Li  i = 6;
120*67e74705SXin Li  clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
121*67e74705SXin Li  scanf("%d", &tmp);
122*67e74705SXin Li  clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
123*67e74705SXin Li  invalidateGlobals();
124*67e74705SXin Li  clang_analyzer_eval(i == 6); // expected-warning{{UNKNOWN}}
125*67e74705SXin Li
126*67e74705SXin Li  if (i == 7) {
127*67e74705SXin Li    clang_analyzer_eval(i == 7); // expected-warning{{TRUE}}
128*67e74705SXin Li    scanf("%d", &i);
129*67e74705SXin Li    clang_analyzer_eval(i == 7); // expected-warning{{UNKNOWN}}
130*67e74705SXin Li  }
131*67e74705SXin Li
132*67e74705SXin Li  i = 8;
133*67e74705SXin Li  clang_analyzer_eval(i == 8); // expected-warning{{TRUE}}
134*67e74705SXin Li  scanf("%d", &i);
135*67e74705SXin Li  clang_analyzer_eval(i == 8); // expected-warning{{UNKNOWN}}
136*67e74705SXin Li}
137*67e74705SXin Li
138*67e74705SXin Livoid testWrappedGlobals(void) {
139*67e74705SXin Li  extern char c;
140*67e74705SXin Li  SomeStruct s;
141*67e74705SXin Li
142*67e74705SXin Li  if (c == 'C') {
143*67e74705SXin Li    s.p = &c;
144*67e74705SXin Li    clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
145*67e74705SXin Li    fakeSystemHeaderCall(0);
146*67e74705SXin Li    clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
147*67e74705SXin Li    fakeSystemHeaderCall(&s);
148*67e74705SXin Li    clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}}
149*67e74705SXin Li  }
150*67e74705SXin Li
151*67e74705SXin Li  c = 'c';
152*67e74705SXin Li  s.p = &c;
153*67e74705SXin Li  clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}}
154*67e74705SXin Li  fakeSystemHeaderCall(0);
155*67e74705SXin Li  clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}}
156*67e74705SXin Li  fakeSystemHeaderCall(&s);
157*67e74705SXin Li  clang_analyzer_eval(c == 'c'); // expected-warning{{UNKNOWN}}
158*67e74705SXin Li
159*67e74705SXin Li  if (c == 'C') {
160*67e74705SXin Li    s.p = &c;
161*67e74705SXin Li    clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
162*67e74705SXin Li    fakeSystemHeaderCall(0);
163*67e74705SXin Li    clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
164*67e74705SXin Li    fakeSystemHeaderCall(&s);
165*67e74705SXin Li    clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}}
166*67e74705SXin Li  }
167*67e74705SXin Li}
168*67e74705SXin Li
169*67e74705SXin Livoid testWrappedStaticsViaGlobal(void) {
170*67e74705SXin Li  static char c;
171*67e74705SXin Li  extern SomeStruct s;
172*67e74705SXin Li
173*67e74705SXin Li  extern char getSomeChar();
174*67e74705SXin Li  c = getSomeChar();
175*67e74705SXin Li
176*67e74705SXin Li  if (c == 'C') {
177*67e74705SXin Li    s.p = &c;
178*67e74705SXin Li    clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
179*67e74705SXin Li    invalidateGlobals();
180*67e74705SXin Li    clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}}
181*67e74705SXin Li  }
182*67e74705SXin Li
183*67e74705SXin Li  c = 'c';
184*67e74705SXin Li  s.p = &c;
185*67e74705SXin Li  clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}}
186*67e74705SXin Li  invalidateGlobals();
187*67e74705SXin Li  clang_analyzer_eval(c == 'c'); // expected-warning{{UNKNOWN}}
188*67e74705SXin Li}
189