--- a/test/hotspot/jtreg/runtime/exceptionMsgs/ArrayIndexOutOfBoundsException/ArrayIndexOutOfBoundsExceptionTest.java Mon Jan 28 23:00:31 2019 +0100
+++ b/test/hotspot/jtreg/runtime/exceptionMsgs/ArrayIndexOutOfBoundsException/ArrayIndexOutOfBoundsExceptionTest.java Tue Jan 29 08:43:33 2019 +0100
@@ -1,6 +1,6 @@
/*
- * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2018 SAP SE. All rights reserved.
+ * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2019 SAP SE. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -51,6 +51,10 @@
*/
public class ArrayIndexOutOfBoundsExceptionTest {
+ static {
+ System.loadLibrary("ArrayIndexOutOfBoundsExceptionTest");
+ }
+
// Some fields used in the test.
static int[] staticArray = new int[0];
static long[][] staticLongArray = new long[0][0];
@@ -88,6 +92,26 @@
}
}
+ static native void doNativeArrayStore(Object[] dst, Object element, int index);
+ static native Object doNativeArrayLoad(Object[] src, int index);
+
+ static native void doNativeBooleanArrayRegionLoad (boolean[] source, int start, int len);
+ static native void doNativeBooleanArrayRegionStore(boolean[] source, int start, int len);
+ static native void doNativeByteArrayRegionLoad (byte[] source, int start, int len);
+ static native void doNativeByteArrayRegionStore (byte[] source, int start, int len);
+ static native void doNativeShortArrayRegionLoad (short[] source, int start, int len);
+ static native void doNativeShortArrayRegionStore (short[] source, int start, int len);
+ static native void doNativeCharArrayRegionLoad (char[] source, int start, int len);
+ static native void doNativeCharArrayRegionStore (char[] source, int start, int len);
+ static native void doNativeIntArrayRegionLoad (int[] source, int start, int len);
+ static native void doNativeIntArrayRegionStore (int[] source, int start, int len);
+ static native void doNativeLongArrayRegionLoad (long[] source, int start, int len);
+ static native void doNativeLongArrayRegionStore (long[] source, int start, int len);
+ static native void doNativeFloatArrayRegionLoad (float[] source, int start, int len);
+ static native void doNativeFloatArrayRegionStore (float[] source, int start, int len);
+ static native void doNativeDoubleArrayRegionLoad (double[] source, int start, int len);
+ static native void doNativeDoubleArrayRegionStore (double[] source, int start, int len);
+
/**
*
*/
@@ -439,5 +463,463 @@
assertEquals(e.getMessage(),
"arraycopy: last destination index 7 out of bounds for float[5]");
}
+
+
+ // Test native array access.
+
+
+ try {
+ System.out.println(doNativeArrayLoad(oa2, 77));
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Index 77 out of bounds for length 5");
+ }
+ try {
+ System.out.println(doNativeArrayLoad(oa1, -1));
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Index -1 out of bounds for length 10");
+ }
+
+ try {
+ doNativeArrayStore(oa1, "Some String", Integer.MIN_VALUE);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Index -2147483648 out of bounds for length 10");
+ }
+ try {
+ doNativeArrayStore(oa1, "Some String", 13);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Index 13 out of bounds for length 10");
+ }
+
+ // Boolean
+
+ // Native array region loads.
+ // Boolean, len negative.
+ try {
+ doNativeBooleanArrayRegionLoad(za2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Boolean, index negative.
+ try {
+ doNativeBooleanArrayRegionLoad(za2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Boolean, index+len too big.
+ try {
+ doNativeBooleanArrayRegionLoad(za2, 3, Integer.MAX_VALUE-1);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483649 out of bounds for length 10");
+ }
+ // Native array region stores
+ // Boolean, len negative.
+ try {
+ doNativeBooleanArrayRegionStore(za2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Boolean, index negative.
+ try {
+ doNativeBooleanArrayRegionStore(za2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Boolean, index+len too big.
+ try {
+ doNativeBooleanArrayRegionStore(za2, 3, Integer.MAX_VALUE);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483650 out of bounds for length 10");
+ }
+
+ // Byte
+
+ // Native array region loads.
+ // Byte, len negative.
+ try {
+ doNativeByteArrayRegionLoad(ba1, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Byte, index negative.
+ try {
+ doNativeByteArrayRegionLoad(ba1, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 0");
+ }
+ // Byte, index+len too big.
+ try {
+ doNativeByteArrayRegionLoad(ba2, 3, Integer.MAX_VALUE-1);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483649 out of bounds for length 10");
+ }
+ // Native array region stores
+ // Byte, len negative.
+ try {
+ doNativeByteArrayRegionStore(ba2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Byte, index negative.
+ try {
+ doNativeByteArrayRegionStore(ba2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Byte, index+len too big.
+ try {
+ doNativeByteArrayRegionStore(ba2, 3, Integer.MAX_VALUE);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483650 out of bounds for length 10");
+ }
+
+ // Short
+
+ // Native array region loads.
+ // Short, len negative.
+ try {
+ doNativeShortArrayRegionLoad(sa2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Short, index negative.
+ try {
+ doNativeShortArrayRegionLoad(sa2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Short, index+len too big.
+ try {
+ doNativeShortArrayRegionLoad(sa2, 3, Integer.MAX_VALUE-1);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483649 out of bounds for length 10");
+ }
+ // Native array region stores
+ // Short, len negative.
+ try {
+ doNativeShortArrayRegionStore(sa2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Short, index negative.
+ try {
+ doNativeShortArrayRegionStore(sa2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Short, index+len too big.
+ try {
+ doNativeShortArrayRegionStore(sa2, 3, Integer.MAX_VALUE);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483650 out of bounds for length 10");
+ }
+
+ // Char
+
+ // Native array region loads.
+ // Char, len negative.
+ try {
+ doNativeCharArrayRegionLoad(ca2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Char, index negative.
+ try {
+ doNativeCharArrayRegionLoad(ca2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Char, index+len too big.
+ try {
+ doNativeCharArrayRegionLoad(ca2, 3, Integer.MAX_VALUE-1);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483649 out of bounds for length 10");
+ }
+ // Native array region stores
+ // Char, len negative.
+ try {
+ doNativeCharArrayRegionStore(ca2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Char, index negative.
+ try {
+ doNativeCharArrayRegionStore(ca2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Char, index+len too big.
+ try {
+ doNativeCharArrayRegionStore(ca2, 3, Integer.MAX_VALUE);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483650 out of bounds for length 10");
+ }
+
+ // Int
+
+ // Native array region loads.
+ // Int, len negative.
+ try {
+ doNativeIntArrayRegionLoad(ia2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Int, index negative.
+ try {
+ doNativeIntArrayRegionLoad(ia2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Int, index+len too big.
+ try {
+ doNativeIntArrayRegionLoad(ia2, 3, Integer.MAX_VALUE-1);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483649 out of bounds for length 10");
+ }
+ // Native array region stores
+ // Int, len negative.
+ try {
+ doNativeIntArrayRegionStore(ia2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Int, index negative.
+ try {
+ doNativeIntArrayRegionStore(ia2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Int, index+len too big.
+ try {
+ doNativeIntArrayRegionStore(ia2, 3, Integer.MAX_VALUE);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483650 out of bounds for length 10");
+ }
+
+ // Long
+
+ // Native array region loads.
+ // Long, len negative.
+ try {
+ doNativeLongArrayRegionLoad(la2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Long, index negative.
+ try {
+ doNativeLongArrayRegionLoad(la2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Long, index+len too big.
+ try {
+ doNativeLongArrayRegionLoad(la2, 3, Integer.MAX_VALUE-1);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483649 out of bounds for length 10");
+ }
+ // Native array region stores
+ // Long, len negative.
+ try {
+ doNativeLongArrayRegionStore(la2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Long, index negative.
+ try {
+ doNativeLongArrayRegionStore(la2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Long, index+len too big.
+ try {
+ doNativeLongArrayRegionStore(la2, 3, Integer.MAX_VALUE);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483650 out of bounds for length 10");
+ }
+
+ // Float
+
+ // Native array region loads.
+ // Float, len negative.
+ try {
+ doNativeFloatArrayRegionLoad(fa2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Float, index negative.
+ try {
+ doNativeFloatArrayRegionLoad(fa2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Float, index+len too big.
+ try {
+ doNativeFloatArrayRegionLoad(fa2, 3, Integer.MAX_VALUE-1);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483649 out of bounds for length 10");
+ }
+ // Native array region stores
+ // Float, len negative.
+ try {
+ doNativeFloatArrayRegionStore(fa2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Float, index negative.
+ try {
+ doNativeFloatArrayRegionStore(fa2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Float, index+len too big.
+ try {
+ doNativeFloatArrayRegionStore(fa2, 3, Integer.MAX_VALUE);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483650 out of bounds for length 10");
+ }
+
+ // Double
+
+ // Native array region loads.
+ // Double, len negative.
+ try {
+ doNativeDoubleArrayRegionLoad(da2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Double, index negative.
+ try {
+ doNativeDoubleArrayRegionLoad(da2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Double, index+len too big.
+ try {
+ doNativeDoubleArrayRegionLoad(da2, 3, Integer.MAX_VALUE-1);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483649 out of bounds for length 10");
+ }
+ // Native array region stores
+ // Double, len negative.
+ try {
+ doNativeDoubleArrayRegionStore(da2, 3, -77);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Length -77 is negative");
+ }
+ // Double, index negative.
+ try {
+ doNativeDoubleArrayRegionStore(da2, -3, 3);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region -3..0 out of bounds for length 10");
+ }
+ // Double, index+len too big.
+ try {
+ doNativeDoubleArrayRegionStore(da2, 3, Integer.MAX_VALUE);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException e) {
+ assertEquals(e.getMessage(),
+ "Array region 3..2147483650 out of bounds for length 10");
+ }
}
}