/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ class Main { public int ifoo; /* Test requires visual inspection of object code to verify */ int noThrow(Main nonNullA, Main nonNullB, Main nonNullC) { // "this" check should be eliminated on both IGET/IPUT ifoo++; // "this" check should be eliminated on both IGET/IPUT if (ifoo != 321) { // Check not eliminated nonNullA.ifoo = 12; // Check not eliminated nonNullB.ifoo = 21; } else { // Check not eliminated nonNullA.ifoo = 12; } // Check eliminated nonNullA.ifoo = 13; // Check not eliminated nonNullB.ifoo = 21; nonNullC = nonNullB; // Check eliminated nonNullC.ifoo = 32; // All null checks eliminated return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo; } /* Test to ensure we don't remove necessary null checks */ int checkThrow(Main nonNullA, Main nonNullB, Main nonNullC, Main nullA, Main nullB, Main nullC) { // "this" check should be eliminated on both IGET/IPUT ifoo++; try { nullA.ifoo = 12; // Should not be reached return -1; } catch (NullPointerException npe) { ifoo++; } try { nullB.ifoo = 13; // Should not be reached return -2; } catch (NullPointerException npe) { ifoo++; } try { nullC.ifoo = 14; // Should not be reached return -3; } catch (NullPointerException npe) { ifoo++; } // "this" check should be eliminated if (ifoo != 321) { // Check not eliminated nonNullA.ifoo = 12; // Check not eliminated nonNullB.ifoo = 21; // Should throw here try { nullA.ifoo = 11; return -4; } catch (NullPointerException npe) { } } else { // Check not eliminated nonNullA.ifoo = 12; // Should throw here try { nullA.ifoo = 11; return -5; } catch (NullPointerException npe) { } } // Check not eliminated nonNullA.ifoo = 13; // Check not eliminated nonNullB.ifoo = 21; nonNullC = nonNullB; // Check eliminated nonNullC.ifoo = 32; // Should throw here try { nullA.ifoo = 13; return -6; } catch (NullPointerException npe) { } return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo; } static int nullCheckTestNoThrow(int x) { Main base = new Main(); Main a = new Main(); Main b = new Main(); Main c = new Main(); base.ifoo = x; return base.noThrow(a,b,c); } static int nullCheckTestThrow(int x) { Main base = new Main(); Main a = new Main(); Main b = new Main(); Main c = new Main(); Main d = null; Main e = null; Main f = null; base.ifoo = x; return base.checkThrow(a,b,c,d,e,f); } static void throwImplicitAIOBE(int[] array, int index) { array[index] = 0; } static int checkAIOBE() { int[] array = new int[10]; int res; try { throwImplicitAIOBE(array, 11); res = 123; } catch (NullPointerException npe) { res = 768; } catch (ArrayIndexOutOfBoundsException e) { res = 456; } try { throwImplicitAIOBE(array, -1); res += 123; } catch (NullPointerException npe) { res += 768; } catch (ArrayIndexOutOfBoundsException e) { res += 456; } return res; } static int throwImplicitDivZero(int x, int y) { return x / y; } static int checkDivZero() { try { throwImplicitDivZero(100, 0); return 123; } catch (NullPointerException npe) { return 768; } catch (ArrayIndexOutOfBoundsException e) { return 987; } catch (ArithmeticException e) { return 456; } } public static void main(String[] args) { boolean failure = false; int res; res = nullCheckTestNoThrow(1976); if (res == 2054) { System.out.println("nullCheckTestNoThrow PASSED"); } else { System.out.println("nullCheckTestNoThrow FAILED: " + res); failure = true; } res = nullCheckTestThrow(1976); if (res == 2057) { System.out.println("nullCheckTestThrow PASSED"); } else { System.out.println("nullCheckTestThrow FAILED: " + res); failure = true; } res = checkAIOBE(); if (res == 912) { System.out.println("checkAIOBE PASSED"); } else { System.out.println("checkAIOBE FAILED: " + res); failure = true; } res = checkDivZero(); if (res == 456) { System.out.println("checkDivZero PASSED"); } else { System.out.println("checkDivZero FAILED: " + res); failure = true; } System.exit(failure ? 1 : 0); } }