On Wed, 13 Mar 2024 13:51:27 GMT, Claes Redestad <redes...@openjdk.org> wrote:

> Relying on the upper bounds check of `charAt` doesn't work well with the 
> `CharArraySequence` whose `charAt` deliberately does not throw an IIOBE if 
> the array is longer than the provided length, ie, it'll look at chars beyond 
> the provided range. The examples I tested still end up as a NFE, but it's 
> clear from the cause that we're running past the length:
> 
> ```
> jshell> new BigDecimal(new char[] { '-', '1', 'e'}, 0, 1);
> |  Exception java.lang.NumberFormatException
> |        at BigDecimal.<init> (BigDecimal.java:754)
> |        at BigDecimal.<init> (BigDecimal.java:543)
> |        at BigDecimal.<init> (BigDecimal.java:518)
> |        at (#4:1)
> |  Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds 
> for length 3
> |        at BigDecimal$CharArraySequence.charAt (BigDecimal.java:559)
> |        at BigDecimal.parseExp (BigDecimal.java:772)
> |        at BigDecimal.<init> (BigDecimal.java:619)
> |        ...
> ```
> 
> Baseline/expected:
> 
> ```
> jshell> new BigDecimal(new char[] { '-', '1', 'e'}, 0, 1);
> |  Exception java.lang.NumberFormatException: No digits found.
> |        at BigDecimal.<init> (BigDecimal.java:635)
> |        at BigDecimal.<init> (BigDecimal.java:518)
> |        at (#1:1)
> ```
> 
> Having a check on `len > 0` is more robust - and I'd be surprised if avoiding 
> a redundant check on the loop entry is affecting performance?

If the likely error/boundary conditions change, those changed conditions should 
be added to the regression tests.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/18177#discussion_r1523509168

Reply via email to