NPE by "[]" and "->" ":"

bitter_fox bitterfoxc at gmail.com
Wed Dec 3 17:24:06 UTC 2014


Temporary easy fix:

diff -r f66d02b651c0 repl/src/tool/ReplParser.java
--- a/repl/src/tool/ReplParser.java    Tue Nov 25 11:46:26 2014 -0800
+++ b/repl/src/tool/ReplParser.java    Thu Dec 04 02:15:31 2014 +0900
@@ -157,6 +157,11 @@
             case RBRACE:
             case CASE:
             case DEFAULT:
+            case ARROW:
+            case COLON:
+            case COLCOL:
+            case LBRACKET:
+                nextToken();
                 return List.nil(); //TODO: these are errors, so handling
probably isn't correct
             case EOF:
                 return List.nil();

If you forget calling nextToken, these inputs make the infinite loop.

Regards,
Shinya Yoshida(@bitter_fox, shinyafox)


2014-12-04 1:52 GMT+09:00 bitter_fox <bitterfoxc at gmail.com>:

> Hi, Robert.
>
> I found corner cases which makes NPE:
>
> -> []
> -----
> Exception in thread "main" java.lang.NullPointerException
>     at
> com.sun.tools.javac.api.JavacTrees$1.getEndPosition(JavacTrees.java:191)
>     at tool.Repl.processSource(Repl.java:280)
>     at tool.Repl.run(Repl.java:121)
>     at tool.Repl.start(Repl.java:95)
>     at tool.Repl.main(Repl.java:82)
>
> The same exception is produced by "->" and ":"
>
> In Repl#processSouce, pt#cuTree returns null.
> And, in ParserTask#<init>, task.parse() returns List.nil().
>
> JavacTaskImpl.parse() returns List.nil() when Throwable is happened in
> JavacTaskImpl#parseInternal.
> So I checked the exception in JavacTaskImpl by following code:
>
> ----
> diff -r f66d02b651c0
> src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java
> ---
> a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskImpl.javaTue
> Nov 25 11:46:26 2014 -0800
> +++
> b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskImpl.javaThu
> Dec 04 01:29:47 2014 +0900
>
> @@ -228,6 +235,12 @@
>              }
>              return units;
>          }
> +        catch (Throwable e)
> +        {
> +            System.out.println("exception!!!\n" + e);
> +            e.printStackTrace();
> +            throw e;
> +        }
>          finally {
>              parsed = true;
>              if (compiler != null && compiler.log != null)
> ----
>
> I could catch the following Exception:
>
> java.lang.AssertionError
>     at com.sun.tools.javac.util.Assert.error(Assert.java:125)
>     at com.sun.tools.javac.util.Assert.check(Assert.java:44)
>     at
> com.sun.tools.javac.parser.JavacParser.reportSyntaxError(JavacParser.java:440)
>     at
> com.sun.tools.javac.parser.JavacParser.reportSyntaxError(JavacParser.java:421)
>     at com.sun.tools.javac.parser.JavacParser.accept(JavacParser.java:470)
>     at tool.ReplParser.replUnit(ReplParser.java:255)
>     at tool.ReplParser.parseCompilationUnit(ReplParser.java:125)
>     at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:596)
>     at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:633)
>     at
> com.sun.tools.javac.main.JavaCompiler.parseFiles(JavaCompiler.java:921)
>     at
> com.sun.tools.javac.api.JavacTaskImpl.parseInternal(JavacTaskImpl.java:227)
>     at
> com.sun.tools.javac.api.JavacTaskImpl.access$400(JavacTaskImpl.java:67)
>     at com.sun.tools.javac.api.JavacTaskImpl$2.call(JavacTaskImpl.java:217)
>     at com.sun.tools.javac.api.JavacTaskImpl$2.call(JavacTaskImpl.java:213)
>     at
> com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:124)
>     at com.sun.tools.javac.api.JavacTaskImpl.parse(JavacTaskImpl.java:213)
>     at tool.TaskFactory$ParseTask.<init>(TaskFactory.java:93)
>     at tool.Repl.processSource(Repl.java:271)
>     at tool.Repl.run(Repl.java:121)
>     at tool.Repl.start(Repl.java:95)
>     at tool.Repl.main(Repl.java:82)
>
> ----
>
> tool.ReplParser.replUnit(ReplParser.java:255) is:
>                         accept(SEMI);
>
> and,
> com.sun.tools.javac.parser.JavacParser.reportSyntaxError(JavacParser.java:440)
> is:
>             //check for a possible infinite loop in parsing:
>             Assert.check(count++ < RECOVERY_THRESHOLD);
>
> It might fail to recover from the error and fall to the infinite loop.
>
> Regards,
> Shinya Yoshida(@bitter_fox, shinyafox)
>


More information about the kulla-dev mailing list