On Fri, 2 Dec 2022 18:53:21 GMT, Sergey Tsypanov <[email protected]> wrote:
>> I found out that this code
>>
>> public class Main {
>> public static void main(String[] args) {
>> String s = "Hello world!";
>> char[] chars = s.toCharArray();
>> int point = Character.codePointAt(chars, -1, 1);
>> }
>> }
>>
>> throws `ArrayIndexOutOfBoundsException` instead of JavaDoc-specified
>> `IndexOutOfBoundsException`:
>>
>> Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index
>> -1 out of bounds for length 12
>> at java.base/java.lang.Character.codePointAtImpl(Character.java:9254)
>> at java.base/java.lang.Character.codePointAt(Character.java:9249)
>> at org.example.Main.main(Main.java:7)
>>
>> and the method doesn't check whether `index` parameter is negative:
>>
>> public static int codePointAt(char[] a, int index, int limit) {
>> if (index >= limit || limit < 0 || limit > a.length) {
>> throw new IndexOutOfBoundsException();
>> }
>> return codePointAtImpl(a, index, limit);
>> }
>>
>> I suggest to check the `index` parameter explicitly instead of relying on
>> AIOOBE thrown from accessing the array with negative index.
>
> Sergey Tsypanov has updated the pull request incrementally with one
> additional commit since the last revision:
>
> 8298033: Fix test
test/jdk/java/lang/Character/Supplementary.java line 808:
> 806: return;
> 807: }
> 808: if (expectedException.isInstance(e)) { //
> Character.codePointBefore() throws
The test should fail without the fix, but this fall-through allows the test to
pass.
The qualification added for `isAt` is hiding a second/corresponding bug in
`codePointBefore` where the index is not checked and an ArrayIndexOutOfBounds
occurs at codePointBeforeImpl: 9488.
-------------
PR: https://git.openjdk.org/jdk/pull/11480