1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 class Main {
18 
19     public int ifoo;
20 
21     /* Test requires visual inspection of object code to verify */
noThrow(Main nonNullA, Main nonNullB, Main nonNullC)22     int noThrow(Main nonNullA,
23                 Main nonNullB,
24                 Main nonNullC) {
25 
26         // "this" check should be eliminated on both IGET/IPUT
27         ifoo++;
28 
29        // "this" check should be eliminated on both IGET/IPUT
30        if (ifoo != 321) {
31            // Check not eliminated
32            nonNullA.ifoo = 12;
33            // Check not eliminated
34            nonNullB.ifoo = 21;
35        } else {
36            // Check not eliminated
37            nonNullA.ifoo = 12;
38        }
39 
40        // Check eliminated
41        nonNullA.ifoo = 13;
42 
43        // Check not eliminated
44        nonNullB.ifoo = 21;
45 
46        nonNullC = nonNullB;
47 
48        // Check eliminated
49        nonNullC.ifoo = 32;
50 
51       // All null checks eliminated
52       return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo;
53     }
54 
55     /* Test to ensure we don't remove necessary null checks */
checkThrow(Main nonNullA, Main nonNullB, Main nonNullC, Main nullA, Main nullB, Main nullC)56     int checkThrow(Main nonNullA,
57                    Main nonNullB,
58                    Main nonNullC,
59                    Main nullA,
60                    Main nullB,
61                    Main nullC) {
62 
63         // "this" check should be eliminated on both IGET/IPUT
64         ifoo++;
65 
66        try {
67            nullA.ifoo = 12;
68            // Should not be reached
69            return -1;
70        } catch (NullPointerException npe) {
71            ifoo++;
72        }
73        try {
74            nullB.ifoo = 13;
75            // Should not be reached
76            return -2;
77        } catch (NullPointerException npe) {
78            ifoo++;
79        }
80        try {
81            nullC.ifoo = 14;
82            // Should not be reached
83            return -3;
84        } catch (NullPointerException npe) {
85            ifoo++;
86        }
87 
88        // "this" check should be eliminated
89        if (ifoo != 321) {
90            // Check not eliminated
91            nonNullA.ifoo = 12;
92            // Check not eliminated
93            nonNullB.ifoo = 21;
94            // Should throw here
95            try {
96                nullA.ifoo = 11;
97                return -4;
98            } catch (NullPointerException npe) {
99            }
100        } else {
101            // Check not eliminated
102            nonNullA.ifoo = 12;
103            // Should throw here
104            try {
105                nullA.ifoo = 11;
106                return -5;
107            } catch (NullPointerException npe) {
108            }
109        }
110 
111        // Check not eliminated
112        nonNullA.ifoo = 13;
113 
114        // Check not eliminated
115        nonNullB.ifoo = 21;
116 
117        nonNullC = nonNullB;
118 
119        // Check eliminated
120        nonNullC.ifoo = 32;
121 
122        // Should throw here
123        try {
124            nullA.ifoo = 13;
125            return -6;
126        } catch (NullPointerException npe) {
127        }
128 
129       return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo;
130     }
131 
132 
nullCheckTestNoThrow(int x)133     static int nullCheckTestNoThrow(int x) {
134         Main base = new Main();
135         Main a = new Main();
136         Main b = new Main();
137         Main c = new Main();
138         base.ifoo = x;
139         return base.noThrow(a,b,c);
140     }
141 
nullCheckTestThrow(int x)142     static int nullCheckTestThrow(int x) {
143         Main base = new Main();
144         Main a = new Main();
145         Main b = new Main();
146         Main c = new Main();
147         Main d = null;
148         Main e = null;
149         Main f = null;
150         base.ifoo = x;
151         return base.checkThrow(a,b,c,d,e,f);
152     }
153 
154 
throwImplicitAIOBE(int[] array, int index)155     static void throwImplicitAIOBE(int[] array, int index) {
156       array[index] = 0;
157     }
158 
checkAIOBE()159     static int checkAIOBE() {
160       int[] array = new int[10];
161       int res;
162       try {
163         throwImplicitAIOBE(array, 11);
164         res = 123;
165       } catch (NullPointerException npe) {
166         res = 768;
167       } catch (ArrayIndexOutOfBoundsException e) {
168         res = 456;
169       }
170       try {
171         throwImplicitAIOBE(array, -1);
172         res += 123;
173       } catch (NullPointerException npe) {
174         res += 768;
175       } catch (ArrayIndexOutOfBoundsException e) {
176         res += 456;
177       }
178       return res;
179     }
180 
throwImplicitDivZero(int x, int y)181     static int throwImplicitDivZero(int x, int y) {
182       return x / y;
183     }
184 
checkDivZero()185     static int checkDivZero() {
186       try {
187         throwImplicitDivZero(100, 0);
188         return 123;
189       } catch (NullPointerException npe) {
190         return 768;
191       } catch (ArrayIndexOutOfBoundsException e) {
192         return 987;
193       } catch (ArithmeticException e) {
194         return 456;
195       }
196     }
197 
main(String[] args)198     public static void main(String[] args) {
199         boolean failure = false;
200         int res;
201 
202         res = nullCheckTestNoThrow(1976);
203         if (res == 2054) {
204             System.out.println("nullCheckTestNoThrow PASSED");
205         } else {
206             System.out.println("nullCheckTestNoThrow FAILED: " + res);
207             failure = true;
208         }
209 
210         res = nullCheckTestThrow(1976);
211         if (res == 2057) {
212             System.out.println("nullCheckTestThrow PASSED");
213         } else {
214             System.out.println("nullCheckTestThrow FAILED: " + res);
215             failure = true;
216         }
217 
218         res = checkAIOBE();
219         if (res == 912) {
220           System.out.println("checkAIOBE PASSED");
221         } else {
222           System.out.println("checkAIOBE FAILED: " + res);
223           failure = true;
224         }
225 
226         res = checkDivZero();
227         if (res == 456) {
228           System.out.println("checkDivZero PASSED");
229         } else {
230           System.out.println("checkDivZero FAILED: " + res);
231           failure = true;
232         }
233         System.exit(failure ? 1 : 0);
234     }
235 }
236