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

bitter_fox bitterfoxc at gmail.com
Wed Dec 3 16:52:51 UTC 2014


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