コード例 #1
0
  static void testArrayIndexOutOfBounds(Handles hs) throws Throwable {
    int[] array = new int[10];

    for (int i : new int[] {-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
      final int ci = i;

      for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
        checkIOOBE(
            am,
            () -> {
              int x = (int) hs.get(am).invokeExact(array, ci);
            });
      }

      for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
        checkIOOBE(
            am,
            () -> {
              hs.get(am).invokeExact(array, ci, 0x01234567);
            });
      }

      for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
        checkIOOBE(
            am,
            () -> {
              boolean r = (boolean) hs.get(am).invokeExact(array, ci, 0x01234567, 0x89ABCDEF);
            });
      }

      for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
        checkIOOBE(
            am,
            () -> {
              int r = (int) hs.get(am).invokeExact(array, ci, 0x89ABCDEF, 0x01234567);
            });
      }

      for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
        checkIOOBE(
            am,
            () -> {
              int o = (int) hs.get(am).invokeExact(array, ci, 0x01234567);
            });
      }

      for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
        checkIOOBE(
            am,
            () -> {
              int o = (int) hs.get(am).invokeExact(array, ci, 0xCAFEBABE);
            });
      }

      for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
        checkIOOBE(
            am,
            () -> {
              int o = (int) hs.get(am).invokeExact(array, ci, 0xCAFEBABE);
            });
      }
    }
  }