Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

InconsistentCapitalization - NullPointerException #1008

Closed
jiri-pejchal opened this issue Apr 23, 2018 · 8 comments
Closed

InconsistentCapitalization - NullPointerException #1008

jiri-pejchal opened this issue Apr 23, 2018 · 8 comments

Comments

@jiri-pejchal
Copy link

[ERROR]      error-prone version: 2.3.1
[ERROR]      BugPattern: InconsistentCapitalization
[ERROR]      Stack Trace:
[ERROR]      java.lang.NullPointerException
[ERROR]         at com.google.errorprone.fixes.SuggestedFixes.renameVariable(SuggestedFixes.java:374)
[ERROR]         at com.google.errorprone.bugpatterns.InconsistentCapitalization.matchClass(InconsistentCapitalization.java:83)
[ERROR]         at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:581)
[ERROR]         at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:145)
[ERROR]         at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:808)
[ERROR]         at com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:82)
[ERROR]         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:82)
[ERROR]         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:42)
[ERROR]         at com.sun.source.util.TreeScanner.scan(TreeScanner.java:105)
[ERROR]         at com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:113)
[ERROR]         at com.sun.source.util.TreeScanner.visitCompilationUnit(TreeScanner.java:144)
[ERROR]         at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:602)
[ERROR]         at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:145)
[ERROR]         at com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:591)
[ERROR]         at com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:56)
[ERROR]         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:64)
[ERROR]         at com.google.errorprone.scanner.ErrorProneScannerTransformer.apply(ErrorProneScannerTransformer.java:43)
[ERROR]         at com.google.errorprone.ErrorProneAnalyzer.finished(ErrorProneAnalyzer.java:152)
[ERROR]         at com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:120)
[ERROR]         at com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1404)
[ERROR]         at com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1353)
[ERROR]         at com.sun.tools.javac.main.JavaCompiler.desugarByFile(JavaCompiler.java:1597)
[ERROR]         at com.sun.tools.javac.main.JavaCompiler.desugar(JavaCompiler.java:1501)
[ERROR]         at com.sun.tools.javac.main.JavaCompiler.desugar(JavaCompiler.java:1418)
[ERROR]         at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:952)
[ERROR]         at com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:100)
[ERROR]         at com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:142)
[ERROR]         at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:96)
[ERROR]         at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:90)
[ERROR]         at com.google.errorprone.BaseErrorProneCompiler.run(BaseErrorProneCompiler.java:137)
[ERROR]         at com.google.errorprone.BaseErrorProneCompiler.run(BaseErrorProneCompiler.java:108)
[ERROR]         at com.google.errorprone.ErrorProneCompiler.run(ErrorProneCompiler.java:118)
[ERROR]         at org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne$CompilerInvoker.compile(JavacCompilerWithErrorProne.java:222)
[ERROR]         at sun.reflect.GeneratedMethodAccessor63.invoke(Unknown Source)
[ERROR]         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR]         at java.lang.reflect.Method.invoke(Method.java:498)
[ERROR]         at org.codehaus.plexus.compiler.javac.errorprone.JavacCompilerWithErrorProne.performCompile(JavacCompilerWithErrorProne.java:91)
[ERROR]         at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:1075)
[ERROR]         at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:168)
[ERROR]         at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
[ERROR]         at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
[ERROR]         at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
[ERROR]         at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
[ERROR]         at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
[ERROR]         at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
[ERROR]         at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
[ERROR]         at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
[ERROR]         at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
[ERROR]         at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
[ERROR]         at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
[ERROR]         at org.apache.maven.cli.MavenCli.execute(MavenCli.java:956)
[ERROR]         at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:290)
[ERROR]         at org.apache.maven.cli.MavenCli.main(MavenCli.java:194)
[ERROR]         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR]         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR]         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR]         at java.lang.reflect.Method.invoke(Method.java:498)
[ERROR]         at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
[ERROR]         at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
[ERROR]         at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
[ERROR]         at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
[ERROR]         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR]         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR]         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR]         at java.lang.reflect.Method.invoke(Method.java:498)
[ERROR]         at org.apache.maven.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:39)
[ERROR]         at org.apache.maven.wrapper.WrapperExecutor.execute(WrapperExecutor.java:122)
[ERROR]         at org.apache.maven.wrapper.MavenWrapperMain.main(MavenWrapperMain.java:55)
@cushon
Copy link
Collaborator

cushon commented Apr 23, 2018

Thanks for the report. Can you provide a self-contained example that reproduces the crash?

@lgemeinhardt
Copy link

I have the same issue using this simplified code

package com.sample;

import java.util.function.Consumer;

public abstract class Callback {

private final WaitHandler waitHandler;

protected Callback(final WaitHandler waithandler) {
	this.waitHandler = waithandler;
}

public static <T> Callback<T> doOnSuccess(final Consumer<T> successAction) {
	return new Callback<T>(null) {

		@Override
		protected void executeOnSuccess(final T t) {
			successAction.accept(t);
		}

	};
}

protected WaitHandler getWaitHandler() {
	return this.waitHandler;
}

protected abstract void executeOnSuccess(final T t);

interface WaitHandler {
	// ignore
}

}

[javac] ...\com\sample\Callback.java:5: error: An unhandled exception was thrown by the Error Prone static analysis plugin.
[javac] public abstract class Callback<T> {
[javac]                 ^
[javac]      Please report this at https://github.com/google/error-prone/issues/new and include the following:
[javac]   
[javac]      error-prone version: 2.3.1
[javac]      BugPattern: InconsistentCapitalization
[javac]      Stack Trace:
[javac]      java.lang.NullPointerException
[javac]   	at com.google.errorprone.fixes.SuggestedFixes.renameVariable(SuggestedFixes.java:374)
[javac]   	at com.google.errorprone.bugpatterns.InconsistentCapitalization.matchClass(InconsistentCapitalization.java:83)
[javac]   	at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:581)
[javac]   	at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:145)
[javac]   	at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:808)
[javac]   	at com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:82)
[javac]   	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:82)
[javac]   	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:42)
[javac]   	at com.sun.source.util.TreeScanner.scan(TreeScanner.java:105)
[javac]   	at com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:113)
[javac]   	at com.sun.source.util.TreeScanner.visitCompilationUnit(TreeScanner.java:144)
[javac]   	at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:602)
[javac]   	at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:145)
[javac]   	at com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:591)
[javac]   	at com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:56)
[javac]   	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:64)
[javac]   	at com.google.errorprone.scanner.ErrorProneScannerTransformer.apply(ErrorProneScannerTransformer.java:43)
[javac]   	at com.google.errorprone.ErrorProneAnalyzer.finished(ErrorProneAnalyzer.java:152)
[javac]   	at com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:120)
[javac]   	at com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1404)
[javac]   	at com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1353)
[javac]   	at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:952)
[javac]   	at com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:100)
[javac]   	at com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:142)
[javac]   	at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:96)
[javac]   	at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:90)
[javac]   	at com.google.errorprone.BaseErrorProneCompiler.run(BaseErrorProneCompiler.java:137)
[javac]   	at com.google.errorprone.BaseErrorProneCompiler.run(BaseErrorProneCompiler.java:108)
[javac]   	at com.google.errorprone.ErrorProneCompiler.run(ErrorProneCompiler.java:118)
[javac]   	at com.google.errorprone.ErrorProneCompiler.compile(ErrorProneCompiler.java:65)
[javac]   	at com.google.errorprone.ErrorProneAntCompilerAdapter$AntRunner.apply(ErrorProneAntCompilerAdapter.java:39)
[javac]   	at com.google.errorprone.ErrorProneAntCompilerAdapter$AntRunner.apply(ErrorProneAntCompilerAdapter.java:36)
[javac]   	at com.google.errorprone.ErrorProneAntCompilerAdapter.execute(ErrorProneAntCompilerAdapter.java:73)
[javac]   	at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:1395)
[javac]   	at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:1121)
[javac]   	at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:293)
[javac]   	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[javac]   	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[javac]   	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[javac]   	at java.lang.reflect.Method.invoke(Method.java:498)
[javac]   	at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
[javac]   	at org.apache.tools.ant.Task.perform(Task.java:348)
[javac]   	at org.apache.tools.ant.Target.execute(Target.java:435)
[javac]   	at org.apache.tools.ant.Target.performTasks(Target.java:456)
[javac]   	at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1405)
[javac]   	at org.apache.tools.ant.Project.executeTarget(Project.java:1376)
[javac]   	at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
[javac]   	at org.eclipse.ant.internal.launching.remote.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:36)
[javac]   	at org.apache.tools.ant.Project.executeTargets(Project.java:1260)
[javac]   	at org.eclipse.ant.internal.launching.remote.InternalAntRunner.run(InternalAntRunner.java:460)
[javac]   	at org.eclipse.ant.internal.launching.remote.InternalAntRunner.main(InternalAntRunner.java:142)
[javac] 1 error

@madrob
Copy link
Contributor

madrob commented Jun 29, 2018

I also have run into this issue with 2.3.0 and 2.3.1, this is a new issue that was not present in 2.2.0.

public class Callback {
  interface WaitHandler { } // ignore

  private final WaitHandler waitHandler;

  protected Callback(final WaitHandler waithandler) {
    this.waitHandler = waithandler;
  }

  public static Callback doOnSuccess() {
    return new Callback(null) {};
  }
}

I was able to pare down the test case provided by @lgemeinhardt into something shorter. The NPE goes away if the doOnSuccess method is removed. It doesn't have anything to do with the null argument being passed to the constructor because if I replace that line with return new Callback(new WaitHandler() {}) {}; then I still get the same crash.

@cushon Any further insights on what is going on here?

@madrob
Copy link
Contributor

madrob commented Jun 29, 2018

In 0283b46 we added a check for state.getSourceForNode(tree.getType()) might be null, but then two lines later we dereference it anyway.

@cushon
Copy link
Collaborator

cushon commented Jun 29, 2018

@madrob thanks for the repro!

two lines later we dereference it anyway

We later dereference state.getSourceForNode(tree), which is different than state.getSourceForNode(tree.getType()). The latter can be null without the former also being null, in the case of implicitly-type lambda parameters. Or am I missing something?

@madrob
Copy link
Contributor

madrob commented Jun 29, 2018

Oh, no, you're right, they are different. I wasn't reading the code carefully enough. I poked around further and it looks like it matters that we're doing an anonymous type. I switched my repro from using WaitHandler to AutoCloseable like the other InconsistentCapitalization tests and noticed that the compilation unit becomes:

class Test {
  private final AutoCloseable autoCloseable;

  protected Test(final AutoCloseable autocloseable) {
    super();
    this.autoCloseable = autocloseable;
  }

  public static Test doOnSuccess() {
    return new Test(null){

        (final java.lang.AutoCloseable autocloseable) {
            super(autocloseable);
        }
    };
  }
}

Trying to suggest a replacement for the final java.lang.AutoCloseable autocloseable bit is what causes NPE since it doesn't exist in the source, which causes state.getSourceForNode(tree) to also return null. In this case, I think we can skip the whole suggested fix, since there is no source to replace. Will have a PR up shortly.

madrob added a commit to madrob/error-prone that referenced this issue Jun 29, 2018
@cushon
Copy link
Collaborator

cushon commented Jun 29, 2018

Thanks, I noticed the same thing look at your repro. Generally we want to run Error Prone checks over the IR prior to any desugaring, but javac adds implicit default constructors really early in the compilation, and we have to ignore them in Error Prone. Here's one example:

I have a fix in progress to use the same approach in this check.

@cushon cushon closed this as completed in 127fbe1 Jun 29, 2018
@madrob
Copy link
Contributor

madrob commented Jul 2, 2018

Is this bugfix enough to motivate a 2.3.2 (or 2.4.0?)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants