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

NPE analysing new style switch statement (2.14.0) #3225

Closed
rob-donovan opened this issue May 26, 2022 · 2 comments
Closed

NPE analysing new style switch statement (2.14.0) #3225

rob-donovan opened this issue May 26, 2022 · 2 comments

Comments

@rob-donovan
Copy link

rob-donovan commented May 26, 2022

Hello,

Since upgrading to version 2.14.0, seeing the following NPE being thrown. It appears this is occurring whilst analysing a method with a new style switch statement where the result is a Supplier of an Optional. For example:

Supplier<Optional<Record>> = switch(enumValue) {
    case VALUE1 -> () -> ....
    case VALUE2 -> () -> .....
};

Changing this to an old-style switch statement prevents the NPE.

14:49:32          error-prone version: 2.14.0
14:49:32          BugPattern: Immutable
14:49:32          Stack Trace:
14:49:32          java.lang.NullPointerException: Cannot invoke "com.google.errorprone.util.ASTHelpers$TargetType.type()" because the return value of "com.google.errorprone.util.ASTHelpers.targetType(com.google.errorprone.VisitorState)" is null
14:49:32         at com.google.errorprone.bugpatterns.threadsafety.ImmutableChecker.matchMemberReference(ImmutableChecker.java:150)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.processMatchers(ErrorProneScanner.java:449)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.visitMemberReference(ErrorProneScanner.java:715)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.visitMemberReference(ErrorProneScanner.java:150)
14:49:32         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMemberReference.accept(JCTree.java:2546)
14:49:32         at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:96)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.visitCase(TreeScanner.java:401)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.visitCase(ErrorProneScanner.java:534)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.visitCase(ErrorProneScanner.java:150)
14:49:32         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCCase.accept(JCTree.java:1357)
14:49:32         at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:111)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:119)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.visitSwitchExpression(TreeScanner.java:384)
14:49:32         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCSwitchExpression.accept(JCTree.java:1390)
14:49:32         at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:96)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.visitVariable(TreeScanner.java:243)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.visitVariable(ErrorProneScanner.java:885)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.visitVariable(ErrorProneScanner.java:150)
14:49:32         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:1045)
14:49:32         at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:111)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.visitBlock(TreeScanner.java:272)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.visitBlock(ErrorProneScanner.java:520)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.visitBlock(ErrorProneScanner.java:150)
14:49:32         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1103)
14:49:32         at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:96)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.visitMethod(TreeScanner.java:224)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.visitMethod(ErrorProneScanner.java:740)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.visitMethod(ErrorProneScanner.java:150)
14:49:32         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:953)
14:49:32         at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:96)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:111)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:119)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.visitClass(TreeScanner.java:203)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:548)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:150)
14:49:32         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:860)
14:49:32         at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:111)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:119)
14:49:32         at jdk.compiler/com.sun.source.util.TreeScanner.visitCompilationUnit(TreeScanner.java:152)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:560)
14:49:32         at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:150)
14:49:32         at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:614)
14:49:32         at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:60)
14:49:32         at com.google.errorprone.scanner.Scanner.scan(Scanner.java:58)
14:49:32         at com.google.errorprone.scanner.ErrorProneScannerTransformer.apply(ErrorProneScannerTransformer.java:43)
14:49:32         at com.google.errorprone.ErrorProneAnalyzer.finished(ErrorProneAnalyzer.java:152)
14:49:32         at jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
14:49:33         at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1394)
14:49:33         at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1341)
14:49:33         at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:933)
14:49:33         at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:317)
14:49:33         at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:176)
14:49:33         at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:64)
14:49:33         at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:50)
@tbroyer
Copy link
Contributor

tbroyer commented May 26, 2022

Looks like a duplicate of #3220

carterkozak added a commit to palantir/gradle-baseline that referenced this issue Jun 15, 2022
It has produced a substantially highter maintenance burden than
we're willing to accept, impacting the error_prone version used
in consumers before we're ready to adopt releases. For example,
google/error-prone#3225 results in
build failures when 2.14.0 is adopted.
@cushon
Copy link
Collaborator

cushon commented Jul 16, 2022

#3220

@cushon cushon closed this as completed Jul 16, 2022
copybara-service bot pushed a commit that referenced this issue Aug 8, 2022
`ASTHelpers#getType(ClassTree)` and `ASTHelpers#targetType(VisitorState)` both may return null, which ImmutableChecker did not previously handle safely, which could lead to `NullPointerException` in cases such as switch expressions. This PR handles these potential `null` results more safely.

Fixes #3220 & #3225

Fixes #3267

COPYBARA_INTEGRATE_REVIEW=#3267 from schlosna:ds/3220 dd8f38f
PiperOrigin-RevId: 466185256
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

3 participants