RFR: 8355371: NegativeArraySizeException in print methods in IO or System.console() in JShell
Jan Lahoda
jlahoda at openjdk.org
Wed Apr 30 16:24:46 UTC 2025
On Sat, 26 Apr 2025 15:54:40 GMT, Tatsunori Uchino <duke at openjdk.org> wrote:
> This PR will fix not only JDK-8355371 but also JDK-8354910. I chose the more serious one.
>
> Note: according to JEP-512 (JDK-8344699), java.io.IO is going to stop using System.console().
> I confirmed it by checking out and building https://github.com/openjdk/jdk/pull/24438. (in that PR, the bug does not occur in `IO.print(ln)`)
>
> Before (Temurin 24):
>
>
> jshell> IO.println("a".repeat(128))
> Exception in thread "output reader" java.lang.NegativeArraySizeException: -128
> | State engine terminated. at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.readCharsOrNull(ConsoleImpl.java:486)
>
> at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.write(ConsoleImpl.java:402)
> at java.base/java.io.OutputStream.write(OutputStream.java:167)
> | Restore definitions with: /reload -restore
> at java.base/java.io.OutputStream.write(OutputStream.java:124)
> at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
>
> jshell> IO.println("ドラえもん")
> ←えツモ
>
> jshell> System.console().writer().println("a".repeat(128))
> Exception in thread "output reader" java.lang.NegativeArraySizeException: -128
> at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.readCharsOrNull(ConsoleImpl.java:486)
> | State engine terminated.
> at jdk.jshell/jdk.jshell.execution.impl.ConsoleImpl$ConsoleOutputStream.write(ConsoleImpl.java:402)
> at java.base/java.io.OutputStream.write(OutputStream.java:167)
> | Restore definitions with: /reload -restore at java.base/java.io.OutputStream.write(OutputStream.java:124)
>
> at jdk.jshell/jdk.jshell.execution.DemultiplexInput.run(DemultiplexInput.java:74)
>
> jshell> System.console().writer().println("ドラえもん")
> ←えツモ
>
>
> After (master & without https://github.com/openjdk/jdk/pull/24438):
>
>
> jshell> IO.println("a".repeat(128))
> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>
> jshell> IO.println("ドラえもん")
> ドラえもん
>
> jshell> System.console().writer().println("a".repeat(128))
> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>
> jshell> System.console().writer().println("ドラえもん")
> ドラえもん
>
>
> I don't know how to prepare the template other PRs use or whether outsiders like me may create a PR.
Looks good to me, thanks!
My only slight worry is with the UTF-8 character - please see the inline comment.
test/langtools/jdk/jshell/ConsoleTest.java line 179:
> 177: };
> 178: int count = 384; // 128-255, 384-511, 640-767, ... (JDK-8355371)
> 179: String testStr = "ア"; // U+30A2 (A2 >= 80) (JDK-8354910)
I am not sure if we can use Unicode chars at this time in the repository. I would suggest to either wait for PR https://github.com/openjdk/jdk/pull/24574 which, I think, formally moves the codebase to UTF-8. Or replace with `\u30A2`.
-------------
PR Review: https://git.openjdk.org/jdk/pull/24897#pullrequestreview-2807657756
PR Review Comment: https://git.openjdk.org/jdk/pull/24897#discussion_r2069030879
More information about the kulla-dev
mailing list