xref: /aosp_15_r20/external/clang/test/Analysis/range_casts.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // This test checks that intersecting ranges does not cause 'system is over constrained' assertions in the case of eg: 32 bits unsigned integers getting their range from 64 bits signed integers.
2*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-store=region -verify %s
3*67e74705SXin Li 
4*67e74705SXin Li void clang_analyzer_warnIfReached();
5*67e74705SXin Li 
f1(long foo)6*67e74705SXin Li void f1(long foo)
7*67e74705SXin Li {
8*67e74705SXin Li   unsigned index = -1;
9*67e74705SXin Li   if (index < foo) index = foo;
10*67e74705SXin Li   if (index + 1 == 0) // because of foo range, index is in range [0; UINT_MAX]
11*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
12*67e74705SXin Li   else
13*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
14*67e74705SXin Li }
15*67e74705SXin Li 
f2(unsigned long foo)16*67e74705SXin Li void f2(unsigned long foo)
17*67e74705SXin Li {
18*67e74705SXin Li   int index = -1;
19*67e74705SXin Li   if (index < foo) index = foo; // index equals ULONG_MAX
20*67e74705SXin Li   if (index + 1 == 0)
21*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
22*67e74705SXin Li   else
23*67e74705SXin Li     clang_analyzer_warnIfReached(); // no-warning
24*67e74705SXin Li }
25*67e74705SXin Li 
f3(unsigned long foo)26*67e74705SXin Li void f3(unsigned long foo)
27*67e74705SXin Li {
28*67e74705SXin Li   unsigned index = -1;
29*67e74705SXin Li   if (index < foo) index = foo;
30*67e74705SXin Li   if (index + 1 == 0)
31*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
32*67e74705SXin Li   else
33*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
34*67e74705SXin Li }
35*67e74705SXin Li 
f4(long foo)36*67e74705SXin Li void f4(long foo)
37*67e74705SXin Li {
38*67e74705SXin Li   int index = -1;
39*67e74705SXin Li   if (index < foo) index = foo;
40*67e74705SXin Li   if (index + 1 == 0)
41*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
42*67e74705SXin Li   else
43*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
44*67e74705SXin Li }
45*67e74705SXin Li 
f5(long foo)46*67e74705SXin Li void f5(long foo)
47*67e74705SXin Li {
48*67e74705SXin Li   unsigned index = -1;
49*67e74705SXin Li   if (index < foo) index = foo;
50*67e74705SXin Li   if (index == -1)
51*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
52*67e74705SXin Li   else
53*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
54*67e74705SXin Li }
55*67e74705SXin Li 
f6(long foo)56*67e74705SXin Li void f6(long foo)
57*67e74705SXin Li {
58*67e74705SXin Li   unsigned index = -1;
59*67e74705SXin Li   if (index < foo) index = foo;
60*67e74705SXin Li   if (index == -1)
61*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
62*67e74705SXin Li   else
63*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
64*67e74705SXin Li }
65*67e74705SXin Li 
f7(long foo)66*67e74705SXin Li void f7(long foo)
67*67e74705SXin Li {
68*67e74705SXin Li   unsigned index = -1;
69*67e74705SXin Li   if (index < foo) index = foo;
70*67e74705SXin Li   if (index - 1 == 0) // Was not reached prior fix.
71*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
72*67e74705SXin Li   else
73*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
74*67e74705SXin Li }
75*67e74705SXin Li 
f8(long foo)76*67e74705SXin Li void f8(long foo)
77*67e74705SXin Li {
78*67e74705SXin Li   unsigned index = -1;
79*67e74705SXin Li   if (index < foo) index = foo;
80*67e74705SXin Li   if (index + 1L == 0L)
81*67e74705SXin Li     clang_analyzer_warnIfReached(); // no-warning
82*67e74705SXin Li   else
83*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
84*67e74705SXin Li }
85*67e74705SXin Li 
f9(long foo)86*67e74705SXin Li void f9(long foo)
87*67e74705SXin Li {
88*67e74705SXin Li   unsigned index = -1;
89*67e74705SXin Li   if (index < foo) index = foo;
90*67e74705SXin Li   if (index - 1L == 0L) // Was not reached prior fix.
91*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
92*67e74705SXin Li   else
93*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
94*67e74705SXin Li }
95*67e74705SXin Li 
f10(long foo)96*67e74705SXin Li void f10(long foo)
97*67e74705SXin Li {
98*67e74705SXin Li   unsigned index = -1;
99*67e74705SXin Li   if (index < foo) index = foo;
100*67e74705SXin Li   if (index + 1 == 0L)
101*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
102*67e74705SXin Li   else
103*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
104*67e74705SXin Li }
105*67e74705SXin Li 
f11(long foo)106*67e74705SXin Li void f11(long foo)
107*67e74705SXin Li {
108*67e74705SXin Li   unsigned index = -1;
109*67e74705SXin Li   if (index < foo) index = foo;
110*67e74705SXin Li   if (index + 1UL == 0L)
111*67e74705SXin Li     clang_analyzer_warnIfReached(); // no-warning
112*67e74705SXin Li   else
113*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
114*67e74705SXin Li }
115*67e74705SXin Li 
f12(long foo)116*67e74705SXin Li void f12(long foo)
117*67e74705SXin Li {
118*67e74705SXin Li   unsigned index = -1;
119*67e74705SXin Li   if (index < foo) index = foo;
120*67e74705SXin Li   if (index - 1UL == 0L) // Was not reached prior fix.
121*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
122*67e74705SXin Li   else
123*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
124*67e74705SXin Li }
125*67e74705SXin Li 
f13(int foo)126*67e74705SXin Li void f13(int foo)
127*67e74705SXin Li {
128*67e74705SXin Li   unsigned short index = -1;
129*67e74705SXin Li   if (index < foo) index = foo;
130*67e74705SXin Li   if (index + 1 == 0)
131*67e74705SXin Li     clang_analyzer_warnIfReached(); // no-warning
132*67e74705SXin Li   else
133*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
134*67e74705SXin Li }
135*67e74705SXin Li 
f14(long foo)136*67e74705SXin Li void f14(long foo)
137*67e74705SXin Li {
138*67e74705SXin Li   unsigned index = -1;
139*67e74705SXin Li   if (index < foo) index = foo;
140*67e74705SXin Li   long bar = foo;
141*67e74705SXin Li   if (index + 1 == 0)
142*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
143*67e74705SXin Li   else
144*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
145*67e74705SXin Li }
146*67e74705SXin Li 
f15(long foo)147*67e74705SXin Li void f15(long foo)
148*67e74705SXin Li {
149*67e74705SXin Li   unsigned index = -1;
150*67e74705SXin Li   if (index < foo) index = foo;
151*67e74705SXin Li   unsigned int tmp = index + 1;
152*67e74705SXin Li   if (tmp == 0)
153*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
154*67e74705SXin Li   else
155*67e74705SXin Li     clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
156*67e74705SXin Li }
157