NullAway: IncompatibleClassChangeError with 0.9.0, JDK 8, and error-prone 2.5.1

When trying to update to 0.9.0, we see this runtime error from dataflow come up

> Task :libraries:foundation:slack-commons:compileReleaseJavaWithJavac
<path≥/slack/commons/logger/DebugLogger.java:27: error: An unhandled exception was thrown by the Error Prone static analysis plugin.
public class DebugLogger implements Logger {
       ^
     Please report this at https://github.com/google/error-prone/issues/new and include the following:
  
     error-prone version: 2.5.1
     BugPattern: NullAway
     Stack Trace:
     java.lang.IncompatibleClassChangeError: Implementing class
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        at com.uber.nullaway.dataflow.DataFlow.<init>(DataFlow.java:78)
        at com.uber.nullaway.dataflow.AccessPathNullnessAnalysis.<init>(AccessPathNullnessAnalysis.java:74)
        at com.uber.nullaway.dataflow.AccessPathNullnessAnalysis.instance(AccessPathNullnessAnalysis.java:104)
        at com.uber.nullaway.NullAway.getNullnessAnalysis(NullAway.java:1971)
        at com.uber.nullaway.NullAway.matchClass(NullAway.java:1139)
        at com.google.errorprone.scanner.ErrorProneScanner.processMatchers(ErrorProneScanner.java:450)
        at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:548)
        at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:151)
        at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:808)
        at com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:82)
        at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
        at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
        at com.sun.source.util.TreeScanner.scan(TreeScanner.java:105)
        at com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:113)
        at com.sun.source.util.TreeScanner.visitCompilationUnit(TreeScanner.java:144)
        at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:561)
        at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:151)
        at com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:591)
        at com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:56)
        at com.google.errorprone.scanner.Scanner.scan(Scanner.java:58)
        at com.google.errorprone.scanner.ErrorProneScannerTransformer.apply(ErrorProneScannerTransformer.java:43)
        at com.google.errorprone.ErrorProneAnalyzer.finished(ErrorProneAnalyzer.java:152)
        at com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:120)
        at com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1404)
        at com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1353)
        at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:946)
        at com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:100)
        at com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:142)
        at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:96)
        at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:90)
        at org.gradle.internal.compiler.java.IncrementalCompileTask.call(IncrementalCompileTask.java:74)
        at org.gradle.api.internal.tasks.compile.AnnotationProcessingCompileTask.call(AnnotationProcessingCompileTask.java:94)
        at org.gradle.api.internal.tasks.compile.ResourceCleaningCompilationTask.call(ResourceCleaningCompilationTask.java:57)
        at ...more gradle lines
1 error

Let me know what else I can help test. Possibly using a non-JDK8-compatible dataflow version?

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Comments: 31 (2 by maintainers)

Most upvoted comments

NullAway 0.9.2 uses a shaded version of the Checker Framework dataflow analysis library (#485), so NullAway should no longer interfere with other Checker Framework dependency versioning schemes. So, I am going to close this issue.

@msridhar I’d seen that - but assumed that only applied if I was putting them in a single <arg. That looks like it worked fine. Time to try this on the main project and see how that works out.

@talios see these docs about passing Error Prone args in Maven now:

https://errorprone.info/docs/flags#maven

Your safest bet is to pass all the arguments in a single <arg> element separated by spaces, e.g.:

<arg>-Xplugin:ErrorProne -Xep:DeadException:WARN -Xep:GuardedBy:OFF</arg>

It’s gross, but that’s what’s needed for JDK 8.

@msridhar Sorry it’s taken so long - was a long weekend here and was out of town for a wedding.

https://github.com/talios/nullawaytest/runs/2456156307

This simple project based on the setup we have, fails to build ( as seen in the github action result - quite glad it failed there, means it’s not just my environment ).

When changing the <version.nullaway>0.9.1</version.nullaway> property in pom.xml back to 0.8.0 - it builds fine.

Even after stripping a bunch of checks, updating maven deps the problem triggers:

https://github.com/talios/nullawaytest/runs/2456244614

@mshekhar I’ll try - this was using Maven 3.8.1 and work build, which we’re fairly strict on dependency ranges and also include a bunch of other annotation processors - every so often we seem to hit a nullaway analysis error mentioning error-prone 2.3.4 as well, so I suspect something, somewhere has an errant dependency but its kinda difficult tracking that down.

Will put out a sample project and try to reproduce.