RFR: 8298033: Character.codePointAt(char[], int, int) doesn't do JavaDoc-specified check [v5]

Roger Riggs rriggs at openjdk.org
Tue Dec 6 16:49:37 UTC 2022


On Tue, 6 Dec 2022 15:28:24 GMT, Sergey Tsypanov <stsypanov at openjdk.org> 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 Character.codePointBefore()

src/java.base/share/classes/java/lang/Character.java line 9480:

> 9478:      */
> 9479:     public static int codePointBefore(char[] a, int index, int start) {
> 9480:         if (index <= start || start < 0 || start >= a.length || index > a.length) {

Since `index > start` it is sufficient to throw `index > a.length`.
The check `start >= a.length` is redundant.

`0 <= start < index <= a.length`

-------------

PR: https://git.openjdk.org/jdk/pull/11480


More information about the core-libs-dev mailing list