xref: /aosp_15_r20/external/clang/test/Analysis/switch-case.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li void clang_analyzer_eval(int);
4*67e74705SXin Li void clang_analyzer_warnIfReached();
5*67e74705SXin Li 
6*67e74705SXin Li #define INT_MIN 0x80000000
7*67e74705SXin Li #define INT_MAX 0x7fffffff
8*67e74705SXin Li 
9*67e74705SXin Li // PR16833: Analyzer consumes memory until killed by kernel OOM killer
10*67e74705SXin Li // while analyzing large case ranges.
PR16833(unsigned op)11*67e74705SXin Li void PR16833(unsigned op) {
12*67e74705SXin Li   switch (op) {
13*67e74705SXin Li   case 0x02 << 26 ... 0x03 << 26: // Analyzer should not hang here.
14*67e74705SXin Li     return;
15*67e74705SXin Li   }
16*67e74705SXin Li }
17*67e74705SXin Li 
testAdjustment(int t)18*67e74705SXin Li void testAdjustment(int t) {
19*67e74705SXin Li   switch (t + 1) {
20*67e74705SXin Li   case 2:
21*67e74705SXin Li     clang_analyzer_eval(t == 1); // expected-warning{{TRUE}}
22*67e74705SXin Li     break;
23*67e74705SXin Li   case 3 ... 10:
24*67e74705SXin Li     clang_analyzer_eval(t > 1);        // expected-warning{{TRUE}}
25*67e74705SXin Li     clang_analyzer_eval(t + 2 <= 11);  // expected-warning{{TRUE}}
26*67e74705SXin Li     clang_analyzer_eval(t > 2);        // expected-warning{{UNKNOWN}}
27*67e74705SXin Li     clang_analyzer_eval(t + 1 == 3);   // expected-warning{{UNKNOWN}}
28*67e74705SXin Li     clang_analyzer_eval(t + 1 == 10);  // expected-warning{{UNKNOWN}}
29*67e74705SXin Li     break;
30*67e74705SXin Li   default:
31*67e74705SXin Li     clang_analyzer_warnIfReached();    // expected-warning{{REACHABLE}}
32*67e74705SXin Li   }
33*67e74705SXin Li }
34*67e74705SXin Li 
testUnknownVal(int value,int mask)35*67e74705SXin Li void testUnknownVal(int value, int mask) {
36*67e74705SXin Li   // Once ConstraintManager will process '&' and this test will require some changes.
37*67e74705SXin Li   switch (value & mask) {
38*67e74705SXin Li     case 1:
39*67e74705SXin Li       clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
40*67e74705SXin Li       break;
41*67e74705SXin Li     case 3 ... 10:
42*67e74705SXin Li       clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
43*67e74705SXin Li       break;
44*67e74705SXin Li     default:
45*67e74705SXin Li       clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
46*67e74705SXin Li   }
47*67e74705SXin Li }
48*67e74705SXin Li 
testSwitchCond(int arg)49*67e74705SXin Li void testSwitchCond(int arg) {
50*67e74705SXin Li   if (arg > 10) {
51*67e74705SXin Li     switch (arg) {
52*67e74705SXin Li     case INT_MIN ... 10:
53*67e74705SXin Li       clang_analyzer_warnIfReached(); // no-warning
54*67e74705SXin Li       break;
55*67e74705SXin Li     case 11 ... 20:
56*67e74705SXin Li       clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
57*67e74705SXin Li       break;
58*67e74705SXin Li     default:
59*67e74705SXin Li       clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
60*67e74705SXin Li     }
61*67e74705SXin Li 
62*67e74705SXin Li     switch (arg) {
63*67e74705SXin Li     case INT_MIN ... 9:
64*67e74705SXin Li       clang_analyzer_warnIfReached();  // no-warning
65*67e74705SXin Li       break;
66*67e74705SXin Li     case 10 ... 20:
67*67e74705SXin Li       clang_analyzer_warnIfReached();  // expected-warning{{REACHABLE}}
68*67e74705SXin Li       clang_analyzer_eval(arg > 10);   // expected-warning{{TRUE}}
69*67e74705SXin Li       break;
70*67e74705SXin Li     default:
71*67e74705SXin Li       clang_analyzer_warnIfReached();  // expected-warning{{REACHABLE}}
72*67e74705SXin Li     }
73*67e74705SXin Li   } // arg > 10
74*67e74705SXin Li }
75*67e74705SXin Li 
testDefaultUnreachable(int arg)76*67e74705SXin Li void testDefaultUnreachable(int arg) {
77*67e74705SXin Li   if (arg > 10) {
78*67e74705SXin Li     switch (arg) {
79*67e74705SXin Li     case INT_MIN ... 9:
80*67e74705SXin Li       clang_analyzer_warnIfReached();   // no-warning
81*67e74705SXin Li       break;
82*67e74705SXin Li     case 10 ... INT_MAX:
83*67e74705SXin Li       clang_analyzer_warnIfReached();   // expected-warning{{REACHABLE}}
84*67e74705SXin Li       clang_analyzer_eval(arg > 10);    // expected-warning{{TRUE}}
85*67e74705SXin Li       break;
86*67e74705SXin Li     default:
87*67e74705SXin Li       clang_analyzer_warnIfReached();   // no-warning
88*67e74705SXin Li     }
89*67e74705SXin Li   }
90*67e74705SXin Li }
91*67e74705SXin Li 
testBranchReachability(int arg)92*67e74705SXin Li void testBranchReachability(int arg) {
93*67e74705SXin Li   if (arg > 10 && arg < 20) {
94*67e74705SXin Li     switch (arg) {
95*67e74705SXin Li     case INT_MIN ... 4:
96*67e74705SXin Li       clang_analyzer_warnIfReached(); // no-warning
97*67e74705SXin Li       break;
98*67e74705SXin Li     case 5 ... 9:
99*67e74705SXin Li       clang_analyzer_warnIfReached(); // no-warning
100*67e74705SXin Li       break;
101*67e74705SXin Li     case 10 ... 15:
102*67e74705SXin Li       clang_analyzer_warnIfReached();              // expected-warning{{REACHABLE}}
103*67e74705SXin Li       clang_analyzer_eval(arg > 10 && arg <= 15);  // expected-warning{{TRUE}}
104*67e74705SXin Li       break;
105*67e74705SXin Li     default:
106*67e74705SXin Li       clang_analyzer_warnIfReached(); // no-warning
107*67e74705SXin Li       break;
108*67e74705SXin Li     case 17 ... 25:
109*67e74705SXin Li       clang_analyzer_warnIfReached();              // expected-warning{{REACHABLE}}
110*67e74705SXin Li       clang_analyzer_eval(arg >= 17 && arg < 20);  // expected-warning{{TRUE}}
111*67e74705SXin Li       break;
112*67e74705SXin Li     case 26 ... INT_MAX:
113*67e74705SXin Li       clang_analyzer_warnIfReached();   // no-warning
114*67e74705SXin Li       break;
115*67e74705SXin Li     case 16:
116*67e74705SXin Li       clang_analyzer_warnIfReached();   // expected-warning{{REACHABLE}}
117*67e74705SXin Li       clang_analyzer_eval(arg == 16);   // expected-warning{{TRUE}}
118*67e74705SXin Li       break;
119*67e74705SXin Li     }
120*67e74705SXin Li   }
121*67e74705SXin Li }
122*67e74705SXin Li 
testDefaultBranchRange(int arg)123*67e74705SXin Li void testDefaultBranchRange(int arg) {
124*67e74705SXin Li   switch (arg) {
125*67e74705SXin Li   case INT_MIN ... 9:
126*67e74705SXin Li     clang_analyzer_warnIfReached();  // expected-warning{{REACHABLE}}
127*67e74705SXin Li     break;
128*67e74705SXin Li   case 20 ... INT_MAX:
129*67e74705SXin Li     clang_analyzer_warnIfReached();  // expected-warning{{REACHABLE}}
130*67e74705SXin Li     clang_analyzer_eval(arg >= 20);  // expected-warning{{TRUE}}
131*67e74705SXin Li     break;
132*67e74705SXin Li   default:
133*67e74705SXin Li     clang_analyzer_warnIfReached();  // expected-warning{{REACHABLE}}
134*67e74705SXin Li     clang_analyzer_eval(arg == 16);  // expected-warning{{FALSE}}
135*67e74705SXin Li     clang_analyzer_eval(arg > 9);    // expected-warning{{TRUE}}
136*67e74705SXin Li     clang_analyzer_eval(arg <= 20);  // expected-warning{{TRUE}}
137*67e74705SXin Li 
138*67e74705SXin Li   case 16:
139*67e74705SXin Li     clang_analyzer_warnIfReached();  // expected-warning{{REACHABLE}}
140*67e74705SXin Li   }
141*67e74705SXin Li }
142*67e74705SXin Li 
testAllUnreachableButDefault(int arg)143*67e74705SXin Li void testAllUnreachableButDefault(int arg) {
144*67e74705SXin Li   if (arg < 0) {
145*67e74705SXin Li     switch (arg) {
146*67e74705SXin Li     case 0 ... 9:
147*67e74705SXin Li       clang_analyzer_warnIfReached(); // no-warning
148*67e74705SXin Li       break;
149*67e74705SXin Li     case 20 ... INT_MAX:
150*67e74705SXin Li       clang_analyzer_warnIfReached(); // no-warning
151*67e74705SXin Li       break;
152*67e74705SXin Li     default:
153*67e74705SXin Li       clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
154*67e74705SXin Li       break;
155*67e74705SXin Li     case 16:
156*67e74705SXin Li       clang_analyzer_warnIfReached(); // no-warning
157*67e74705SXin Li     }
158*67e74705SXin Li     clang_analyzer_warnIfReached();   // expected-warning{{REACHABLE}}
159*67e74705SXin Li   }
160*67e74705SXin Li }
161*67e74705SXin Li 
testAllUnreachable(int arg)162*67e74705SXin Li void testAllUnreachable(int arg) {
163*67e74705SXin Li   if (arg < 0) {
164*67e74705SXin Li     switch (arg) {
165*67e74705SXin Li     case 0 ... 9:
166*67e74705SXin Li       clang_analyzer_warnIfReached(); // no-warning
167*67e74705SXin Li       break;
168*67e74705SXin Li     case 20 ... INT_MAX:
169*67e74705SXin Li       clang_analyzer_warnIfReached(); // no-warning
170*67e74705SXin Li       break;
171*67e74705SXin Li     case 16:
172*67e74705SXin Li       clang_analyzer_warnIfReached(); // no-warning
173*67e74705SXin Li     }
174*67e74705SXin Li     clang_analyzer_warnIfReached();   // expected-warning{{REACHABLE}}
175*67e74705SXin Li   }
176*67e74705SXin Li }
177*67e74705SXin Li 
testDifferentTypes(int arg)178*67e74705SXin Li void testDifferentTypes(int arg) {
179*67e74705SXin Li   switch (arg) {
180*67e74705SXin Li   case -1U ... 400000000LL:
181*67e74705SXin Li       clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
182*67e74705SXin Li       break;
183*67e74705SXin Li     default:
184*67e74705SXin Li       clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
185*67e74705SXin Li       break;
186*67e74705SXin Li   }
187*67e74705SXin Li }
188*67e74705SXin Li 
testDifferentTypes2(unsigned long arg)189*67e74705SXin Li void testDifferentTypes2(unsigned long arg) {
190*67e74705SXin Li   switch (arg) {
191*67e74705SXin Li   case 1UL ... 400000000UL:
192*67e74705SXin Li       clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
193*67e74705SXin Li       break;
194*67e74705SXin Li     default:
195*67e74705SXin Li       clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
196*67e74705SXin Li       break;
197*67e74705SXin Li   }
198*67e74705SXin Li }
199*67e74705SXin Li 
testDifferentTypes3(int arg)200*67e74705SXin Li void testDifferentTypes3(int arg) {
201*67e74705SXin Li   switch (arg) {
202*67e74705SXin Li   case 1UL ... 400000000UL:
203*67e74705SXin Li       clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
204*67e74705SXin Li       break;
205*67e74705SXin Li     default:
206*67e74705SXin Li       clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
207*67e74705SXin Li       break;
208*67e74705SXin Li   }
209*67e74705SXin Li }
210*67e74705SXin Li 
testConstant()211*67e74705SXin Li void testConstant() {
212*67e74705SXin Li   switch (3) {
213*67e74705SXin Li   case 1 ... 5:
214*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
215*67e74705SXin Li     break;
216*67e74705SXin Li   default:
217*67e74705SXin Li     clang_analyzer_warnIfReached(); // no-warning
218*67e74705SXin Li     break;
219*67e74705SXin Li   }
220*67e74705SXin Li }
221