12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 1643a364291dcdfe08e530e9568748359735dd7442buzbee 17a26babddfce488172648efcd18d8c9e672a71759Ian Rogersclass Main { 1843a364291dcdfe08e530e9568748359735dd7442buzbee 1943a364291dcdfe08e530e9568748359735dd7442buzbee public int ifoo; 2043a364291dcdfe08e530e9568748359735dd7442buzbee 2143a364291dcdfe08e530e9568748359735dd7442buzbee /* Test requires visual inspection of object code to verify */ 22a26babddfce488172648efcd18d8c9e672a71759Ian Rogers int noThrow(Main nonNullA, 23a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main nonNullB, 24a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main nonNullC) { 2543a364291dcdfe08e530e9568748359735dd7442buzbee 2643a364291dcdfe08e530e9568748359735dd7442buzbee // "this" check should be eliminated on both IGET/IPUT 2743a364291dcdfe08e530e9568748359735dd7442buzbee ifoo++; 2843a364291dcdfe08e530e9568748359735dd7442buzbee 2943a364291dcdfe08e530e9568748359735dd7442buzbee // "this" check should be eliminated on both IGET/IPUT 3043a364291dcdfe08e530e9568748359735dd7442buzbee if (ifoo != 321) { 3143a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 3243a364291dcdfe08e530e9568748359735dd7442buzbee nonNullA.ifoo = 12; 3343a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 3443a364291dcdfe08e530e9568748359735dd7442buzbee nonNullB.ifoo = 21; 3543a364291dcdfe08e530e9568748359735dd7442buzbee } else { 3643a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 3743a364291dcdfe08e530e9568748359735dd7442buzbee nonNullA.ifoo = 12; 3843a364291dcdfe08e530e9568748359735dd7442buzbee } 3943a364291dcdfe08e530e9568748359735dd7442buzbee 4043a364291dcdfe08e530e9568748359735dd7442buzbee // Check eliminated 4143a364291dcdfe08e530e9568748359735dd7442buzbee nonNullA.ifoo = 13; 4243a364291dcdfe08e530e9568748359735dd7442buzbee 4343a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 4443a364291dcdfe08e530e9568748359735dd7442buzbee nonNullB.ifoo = 21; 4543a364291dcdfe08e530e9568748359735dd7442buzbee 4643a364291dcdfe08e530e9568748359735dd7442buzbee nonNullC = nonNullB; 4743a364291dcdfe08e530e9568748359735dd7442buzbee 4843a364291dcdfe08e530e9568748359735dd7442buzbee // Check eliminated 4943a364291dcdfe08e530e9568748359735dd7442buzbee nonNullC.ifoo = 32; 5043a364291dcdfe08e530e9568748359735dd7442buzbee 5143a364291dcdfe08e530e9568748359735dd7442buzbee // All null checks eliminated 5243a364291dcdfe08e530e9568748359735dd7442buzbee return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo; 5343a364291dcdfe08e530e9568748359735dd7442buzbee } 5443a364291dcdfe08e530e9568748359735dd7442buzbee 5543a364291dcdfe08e530e9568748359735dd7442buzbee /* Test to ensure we don't remove necessary null checks */ 56a26babddfce488172648efcd18d8c9e672a71759Ian Rogers int checkThrow(Main nonNullA, 57a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main nonNullB, 58a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main nonNullC, 59a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main nullA, 60a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main nullB, 61a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main nullC) { 6243a364291dcdfe08e530e9568748359735dd7442buzbee 6343a364291dcdfe08e530e9568748359735dd7442buzbee // "this" check should be eliminated on both IGET/IPUT 6443a364291dcdfe08e530e9568748359735dd7442buzbee ifoo++; 6543a364291dcdfe08e530e9568748359735dd7442buzbee 6643a364291dcdfe08e530e9568748359735dd7442buzbee try { 6743a364291dcdfe08e530e9568748359735dd7442buzbee nullA.ifoo = 12; 6843a364291dcdfe08e530e9568748359735dd7442buzbee // Should not be reached 6943a364291dcdfe08e530e9568748359735dd7442buzbee return -1; 7043a364291dcdfe08e530e9568748359735dd7442buzbee } catch (NullPointerException npe) { 7143a364291dcdfe08e530e9568748359735dd7442buzbee ifoo++; 7243a364291dcdfe08e530e9568748359735dd7442buzbee } 7343a364291dcdfe08e530e9568748359735dd7442buzbee try { 7443a364291dcdfe08e530e9568748359735dd7442buzbee nullB.ifoo = 13; 7543a364291dcdfe08e530e9568748359735dd7442buzbee // Should not be reached 7643a364291dcdfe08e530e9568748359735dd7442buzbee return -2; 7743a364291dcdfe08e530e9568748359735dd7442buzbee } catch (NullPointerException npe) { 7843a364291dcdfe08e530e9568748359735dd7442buzbee ifoo++; 7943a364291dcdfe08e530e9568748359735dd7442buzbee } 8043a364291dcdfe08e530e9568748359735dd7442buzbee try { 8143a364291dcdfe08e530e9568748359735dd7442buzbee nullC.ifoo = 14; 8243a364291dcdfe08e530e9568748359735dd7442buzbee // Should not be reached 8343a364291dcdfe08e530e9568748359735dd7442buzbee return -3; 8443a364291dcdfe08e530e9568748359735dd7442buzbee } catch (NullPointerException npe) { 8543a364291dcdfe08e530e9568748359735dd7442buzbee ifoo++; 8643a364291dcdfe08e530e9568748359735dd7442buzbee } 8743a364291dcdfe08e530e9568748359735dd7442buzbee 8843a364291dcdfe08e530e9568748359735dd7442buzbee // "this" check should be eliminated 8943a364291dcdfe08e530e9568748359735dd7442buzbee if (ifoo != 321) { 9043a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 9143a364291dcdfe08e530e9568748359735dd7442buzbee nonNullA.ifoo = 12; 9243a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 9343a364291dcdfe08e530e9568748359735dd7442buzbee nonNullB.ifoo = 21; 9443a364291dcdfe08e530e9568748359735dd7442buzbee // Should throw here 9543a364291dcdfe08e530e9568748359735dd7442buzbee try { 9643a364291dcdfe08e530e9568748359735dd7442buzbee nullA.ifoo = 11; 9743a364291dcdfe08e530e9568748359735dd7442buzbee return -4; 9843a364291dcdfe08e530e9568748359735dd7442buzbee } catch (NullPointerException npe) { 9943a364291dcdfe08e530e9568748359735dd7442buzbee } 10043a364291dcdfe08e530e9568748359735dd7442buzbee } else { 10143a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 10243a364291dcdfe08e530e9568748359735dd7442buzbee nonNullA.ifoo = 12; 10343a364291dcdfe08e530e9568748359735dd7442buzbee // Should throw here 10443a364291dcdfe08e530e9568748359735dd7442buzbee try { 10543a364291dcdfe08e530e9568748359735dd7442buzbee nullA.ifoo = 11; 10643a364291dcdfe08e530e9568748359735dd7442buzbee return -5; 10743a364291dcdfe08e530e9568748359735dd7442buzbee } catch (NullPointerException npe) { 10843a364291dcdfe08e530e9568748359735dd7442buzbee } 10943a364291dcdfe08e530e9568748359735dd7442buzbee } 11043a364291dcdfe08e530e9568748359735dd7442buzbee 11143a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 11243a364291dcdfe08e530e9568748359735dd7442buzbee nonNullA.ifoo = 13; 11343a364291dcdfe08e530e9568748359735dd7442buzbee 11443a364291dcdfe08e530e9568748359735dd7442buzbee // Check not eliminated 11543a364291dcdfe08e530e9568748359735dd7442buzbee nonNullB.ifoo = 21; 11643a364291dcdfe08e530e9568748359735dd7442buzbee 11743a364291dcdfe08e530e9568748359735dd7442buzbee nonNullC = nonNullB; 11843a364291dcdfe08e530e9568748359735dd7442buzbee 11943a364291dcdfe08e530e9568748359735dd7442buzbee // Check eliminated 12043a364291dcdfe08e530e9568748359735dd7442buzbee nonNullC.ifoo = 32; 12143a364291dcdfe08e530e9568748359735dd7442buzbee 12243a364291dcdfe08e530e9568748359735dd7442buzbee // Should throw here 12343a364291dcdfe08e530e9568748359735dd7442buzbee try { 12443a364291dcdfe08e530e9568748359735dd7442buzbee nullA.ifoo = 13; 12543a364291dcdfe08e530e9568748359735dd7442buzbee return -6; 12643a364291dcdfe08e530e9568748359735dd7442buzbee } catch (NullPointerException npe) { 12743a364291dcdfe08e530e9568748359735dd7442buzbee } 12843a364291dcdfe08e530e9568748359735dd7442buzbee 12943a364291dcdfe08e530e9568748359735dd7442buzbee return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo; 13043a364291dcdfe08e530e9568748359735dd7442buzbee } 13143a364291dcdfe08e530e9568748359735dd7442buzbee 13243a364291dcdfe08e530e9568748359735dd7442buzbee 13343a364291dcdfe08e530e9568748359735dd7442buzbee static int nullCheckTestNoThrow(int x) { 134a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main base = new Main(); 135a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main a = new Main(); 136a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main b = new Main(); 137a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main c = new Main(); 13843a364291dcdfe08e530e9568748359735dd7442buzbee base.ifoo = x; 13943a364291dcdfe08e530e9568748359735dd7442buzbee return base.noThrow(a,b,c); 14043a364291dcdfe08e530e9568748359735dd7442buzbee } 14143a364291dcdfe08e530e9568748359735dd7442buzbee 14243a364291dcdfe08e530e9568748359735dd7442buzbee static int nullCheckTestThrow(int x) { 143a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main base = new Main(); 144a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main a = new Main(); 145a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main b = new Main(); 146a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main c = new Main(); 147a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main d = null; 148a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main e = null; 149a26babddfce488172648efcd18d8c9e672a71759Ian Rogers Main f = null; 15043a364291dcdfe08e530e9568748359735dd7442buzbee base.ifoo = x; 15143a364291dcdfe08e530e9568748359735dd7442buzbee return base.checkThrow(a,b,c,d,e,f); 15243a364291dcdfe08e530e9568748359735dd7442buzbee } 15343a364291dcdfe08e530e9568748359735dd7442buzbee 15443a364291dcdfe08e530e9568748359735dd7442buzbee 1559651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers static void throwImplicitAIOBE(int[] array, int index) { 1569651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers array[index] = 0; 1579651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } 1589651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers 1599651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers static int checkAIOBE() { 1609651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers int[] array = new int[10]; 1619651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers int res; 1629651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers try { 1639651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers throwImplicitAIOBE(array, 11); 1649651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers res = 123; 1659651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } catch (NullPointerException npe) { 1669651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers res = 768; 1679651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } catch (ArrayIndexOutOfBoundsException e) { 1689651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers res = 456; 1699651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } 1709651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers try { 1719651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers throwImplicitAIOBE(array, -1); 1729651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers res += 123; 1739651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } catch (NullPointerException npe) { 1749651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers res += 768; 1759651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } catch (ArrayIndexOutOfBoundsException e) { 1769651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers res += 456; 1779651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } 1789651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers return res; 1799651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } 1809651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers 1819651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers static int throwImplicitDivZero(int x, int y) { 1829651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers return x / y; 1839651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } 1849651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers 1859651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers static int checkDivZero() { 1869651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers try { 1879651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers throwImplicitDivZero(100, 0); 1889651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers return 123; 1899651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } catch (NullPointerException npe) { 1909651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers return 768; 1919651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } catch (ArrayIndexOutOfBoundsException e) { 1929651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers return 987; 1939651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } catch (ArithmeticException e) { 1949651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers return 456; 1959651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } 1969651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } 1979651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers 19843a364291dcdfe08e530e9568748359735dd7442buzbee public static void main(String[] args) { 199bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom boolean failure = false; 20043a364291dcdfe08e530e9568748359735dd7442buzbee int res; 20143a364291dcdfe08e530e9568748359735dd7442buzbee 20243a364291dcdfe08e530e9568748359735dd7442buzbee res = nullCheckTestNoThrow(1976); 20343a364291dcdfe08e530e9568748359735dd7442buzbee if (res == 2054) { 20443a364291dcdfe08e530e9568748359735dd7442buzbee System.out.println("nullCheckTestNoThrow PASSED"); 20543a364291dcdfe08e530e9568748359735dd7442buzbee } else { 20643a364291dcdfe08e530e9568748359735dd7442buzbee System.out.println("nullCheckTestNoThrow FAILED: " + res); 207bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom failure = true; 20843a364291dcdfe08e530e9568748359735dd7442buzbee } 20943a364291dcdfe08e530e9568748359735dd7442buzbee 21043a364291dcdfe08e530e9568748359735dd7442buzbee res = nullCheckTestThrow(1976); 21143a364291dcdfe08e530e9568748359735dd7442buzbee if (res == 2057) { 212bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom System.out.println("nullCheckTestThrow PASSED"); 21343a364291dcdfe08e530e9568748359735dd7442buzbee } else { 214bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom System.out.println("nullCheckTestThrow FAILED: " + res); 215bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom failure = true; 21643a364291dcdfe08e530e9568748359735dd7442buzbee } 2179651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers 2189651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers res = checkAIOBE(); 2199651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers if (res == 912) { 2209651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers System.out.println("checkAIOBE PASSED"); 2219651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } else { 2229651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers System.out.println("checkAIOBE FAILED: " + res); 2239651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers failure = true; 2249651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } 2259651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers 2269651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers res = checkDivZero(); 2279651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers if (res == 456) { 2289651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers System.out.println("checkDivZero PASSED"); 2299651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } else { 2309651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers System.out.println("checkDivZero FAILED: " + res); 2319651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers failure = true; 2329651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers } 233bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom System.exit(failure ? 1 : 0); 23443a364291dcdfe08e530e9568748359735dd7442buzbee } 23543a364291dcdfe08e530e9568748359735dd7442buzbee} 236