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

IndexOutOfBoundsException in FallThrough.matchSwitch caused by Lombok annotations #613

Closed
ewirch opened this issue Apr 30, 2017 · 4 comments
Labels

Comments

@ewirch
Copy link

ewirch commented Apr 30, 2017

Error:(32, 5) java: An unhandled exception was thrown by the Error Prone static analysis plugin.
     Please report this at https://github.com/google/error-prone/issues/new and include the following:
  
     error-prone version: 2.0.19
     Stack Trace:
     java.lang.IndexOutOfBoundsException
  	at java.nio.HeapCharBuffer.subSequence(HeapCharBuffer.java:580)
  	at java.nio.HeapCharBuffer.subSequence(HeapCharBuffer.java:42)
  	at com.google.errorprone.bugpatterns.FallThrough.matchSwitch(FallThrough.java:70)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitSwitch(ErrorProneScanner.java:1075)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitSwitch(ErrorProneScanner.java:144)
  	at com.sun.tools.javac.tree.JCTree$JCSwitch.accept(JCTree.java:1193)
  	at com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:71)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:89)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:43)
  	at com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:90)
  	at com.sun.source.util.TreeScanner.scan(TreeScanner.java:105)
  	at com.sun.source.util.TreeScanner.visitBlock(TreeScanner.java:248)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitBlock(ErrorProneScanner.java:575)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitBlock(ErrorProneScanner.java:144)
  	at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:996)
  	at com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:71)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:89)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:43)
  	at com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:90)
  	at com.sun.source.util.TreeScanner.visitMethod(TreeScanner.java:206)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitMethod(ErrorProneScanner.java:943)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitMethod(ErrorProneScanner.java:144)
  	at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:868)
  	at com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:71)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:89)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:43)
  	at com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:90)
  	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.visitClass(TreeScanner.java:187)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:635)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:144)
  	at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:778)
  	at com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:71)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:89)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:43)
  	at com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:90)
  	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.visitClass(TreeScanner.java:187)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:635)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:144)
  	at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:778)
  	at com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:71)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:89)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:43)
  	at com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:90)
  	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.visitClass(TreeScanner.java:187)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:635)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:144)
  	at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:778)
  	at com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:71)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:89)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:43)
  	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:650)
  	at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:144)
  	at com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:561)
  	at com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:52)
  	at com.google.errorprone.scanner.Scanner.scan(Scanner.java:68)
  	at com.google.errorprone.scanner.ErrorProneScannerTransformer.apply(ErrorProneScannerTransformer.java:43)
  	at com.google.errorprone.ErrorProneAnalyzer.finished(ErrorProneAnalyzer.java:145)
  	at com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:120)
  	at com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1277)
  	at com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1226)
  	at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:840)
  	at com.sun.tools.javac.api.JavacTaskImpl$1.call(JavacTaskImpl.java:97)
  	at com.sun.tools.javac.api.JavacTaskImpl$1.call(JavacTaskImpl.java:93)
  	at com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:128)
  	at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:93)
  	at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:87)
  	at com.google.errorprone.BaseErrorProneJavaCompiler$1.call(BaseErrorProneJavaCompiler.java:99)
  	at org.jetbrains.jps.javac.JavacMain.compile(JavacMain.java:185)
  	at org.jetbrains.jps.incremental.java.JavaBuilder.compileJava(JavaBuilder.java:483)
  	at org.jetbrains.jps.incremental.java.JavaBuilder.compile(JavaBuilder.java:339)
  	at org.jetbrains.jps.incremental.java.JavaBuilder.doBuild(JavaBuilder.java:256)
  	at org.jetbrains.jps.incremental.java.JavaBuilder.build(JavaBuilder.java:214)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.runModuleLevelBuilders(IncProjectBuilder.java:1263)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.runBuildersForChunk(IncProjectBuilder.java:940)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.buildTargetsChunk(IncProjectBuilder.java:1012)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.buildChunkIfAffected(IncProjectBuilder.java:903)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.buildChunks(IncProjectBuilder.java:736)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.runBuild(IncProjectBuilder.java:384)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.build(IncProjectBuilder.java:192)
  	at org.jetbrains.jps.cmdline.BuildRunner.runBuild(BuildRunner.java:138)
  	at org.jetbrains.jps.cmdline.BuildSession.runBuild(BuildSession.java:295)
  	at org.jetbrains.jps.cmdline.BuildSession.run(BuildSession.java:125)
  	at org.jetbrains.jps.cmdline.BuildMain$MyMessageHandler.lambda$channelRead0$0(BuildMain.java:236)
  	at org.jetbrains.jps.service.impl.SharedThreadPoolImpl.lambda$executeOnPooledThread$0(SharedThreadPoolImpl.java:42)
  	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
  	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  	at java.lang.Thread.run(Thread.java:745)

Line 32, colum 5 was pointing to:

@Data
@Builder
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public class Message {

   ...

   @Data
   @Builder
// ^ here
   @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
   public static class Attachment {

The annotations are from Project Lombok. If I replace the annotations by the corresponding generated code, the exception is not thrown.

@cushon
Copy link
Collaborator

cushon commented May 1, 2017

Thanks for the report. Do you have a self-contained example that reproduces the problem?

@ewirch
Copy link
Author

ewirch commented May 22, 2017

Attached:
error-prone-lombok.zip

Compile with

mvn compile

And you will get a IndexOutOfBoundsException. Tested with

java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

@stevezxu
Copy link

stevezxu commented Jan 4, 2018

This could be issue with lombok as well, please check projectlombok/lombok#985. For @ewirch's example, if you change the errorprone version to 2.0.15, the error is no longer happening.

@cushon
Copy link
Collaborator

cushon commented Jan 19, 2021

The issue with FallThrough specifically is fixed in the latest releases by #1573.

@cushon cushon closed this as completed Jan 19, 2021
j-sandy added a commit to j-sandy/orca that referenced this issue Nov 26, 2021
While building orca with upgraded spring boot version 2.3.12, google error-prone package throwing IndexOutOfBoundException as given below:

orca/orca-api/src/main/java/com/netflix/spinnaker/orca/api/pipeline/TaskResult.java:32: error: An unhandled exception was thrown by the Error Prone static analysis plugin.
@builder
    ^
     Please report this at https://github.com/google/error-prone/issues/new and include the following:

     error-prone version: 2.4.0
     BugPattern: FallThrough
     Stack Trace:
     java.lang.IndexOutOfBoundsException
        at java.base/java.nio.HeapCharBuffer.subSequence(HeapCharBuffer.java:633)
        at java.base/java.nio.HeapCharBuffer.subSequence(HeapCharBuffer.java:41)
        at com.google.errorprone.bugpatterns.FallThrough.matchSwitch(FallThrough.java:70)
        at com.google.errorprone.scanner.ErrorProneScanner.processMatchers(ErrorProneScanner.java:451)
        at com.google.errorprone.scanner.ErrorProneScanner.visitSwitch(ErrorProneScanner.java:825)
        at com.google.errorprone.scanner.ErrorProneScanner.visitSwitch(ErrorProneScanner.java:152)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCSwitch.accept(JCTree.java:1229)
        at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:82)

The error is due to Lombok lib upgrade from 1.18.16 to 1.18.20 as transitive dependency of Spring boot. Similar to the issue mentioned below
google/error-prone#2575

Further investigation reveal that bug pattern "FallThrough" for lombok annotations (like @Singular) could be a false positive, because Lombok  modifies the AST on the fly causing trouble to errorprone checks, as mentioned in below issue and PR.
google/error-prone#613
google/error-prone#1573

Considering the above points, we can suppress warning of "FallThrough" bug pattern reported by errorprone for @Builder/@Singular annotations.
mergify bot pushed a commit to spinnaker/orca that referenced this issue Nov 29, 2021
…#4194)

* Remove @Singular annotation
While building orca with upgraded spring boot version 2.3.12, google error-prone package throwing IndexOutOfBoundException as given below:

orca/orca-api/src/main/java/com/netflix/spinnaker/orca/api/pipeline/TaskResult.java:32: error: An unhandled exception was thrown by the Error Prone static analysis plugin.
@builder
^
     Please report this at https://github.com/google/error-prone/issues/new and include the following:

     error-prone version: 2.4.0
     BugPattern: FallThrough
     Stack Trace:
     java.lang.IndexOutOfBoundsException
        at java.base/java.nio.HeapCharBuffer.subSequence(HeapCharBuffer.java:633)
        at java.base/java.nio.HeapCharBuffer.subSequence(HeapCharBuffer.java:41)
        at com.google.errorprone.bugpatterns.FallThrough.matchSwitch(FallThrough.java:70)
        at com.google.errorprone.scanner.ErrorProneScanner.processMatchers(ErrorProneScanner.java:451)
        at com.google.errorprone.scanner.ErrorProneScanner.visitSwitch(ErrorProneScanner.java:825)
        at com.google.errorprone.scanner.ErrorProneScanner.visitSwitch(ErrorProneScanner.java:152)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCSwitch.accept(JCTree.java:1229)
        at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:82)

The error is due to Lombok lib upgrade from 1.18.16 to 1.18.20 as transitive dependency of Spring boot. Similar to the issue mentioned below
google/error-prone#2575

Fix:
To remove @Singular annotation from classes using Lombok builder pattern.

Reference:
projectlombok/lombok#2221

* Revert "Remove @Singular annotation"

This reverts commit e0d57a2.

* Suppress warning for "FallThrough" bug pattern reported by errorprone
While building orca with upgraded spring boot version 2.3.12, google error-prone package throwing IndexOutOfBoundException as given below:

orca/orca-api/src/main/java/com/netflix/spinnaker/orca/api/pipeline/TaskResult.java:32: error: An unhandled exception was thrown by the Error Prone static analysis plugin.
@builder
    ^
     Please report this at https://github.com/google/error-prone/issues/new and include the following:

     error-prone version: 2.4.0
     BugPattern: FallThrough
     Stack Trace:
     java.lang.IndexOutOfBoundsException
        at java.base/java.nio.HeapCharBuffer.subSequence(HeapCharBuffer.java:633)
        at java.base/java.nio.HeapCharBuffer.subSequence(HeapCharBuffer.java:41)
        at com.google.errorprone.bugpatterns.FallThrough.matchSwitch(FallThrough.java:70)
        at com.google.errorprone.scanner.ErrorProneScanner.processMatchers(ErrorProneScanner.java:451)
        at com.google.errorprone.scanner.ErrorProneScanner.visitSwitch(ErrorProneScanner.java:825)
        at com.google.errorprone.scanner.ErrorProneScanner.visitSwitch(ErrorProneScanner.java:152)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCSwitch.accept(JCTree.java:1229)
        at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:82)

The error is due to Lombok lib upgrade from 1.18.16 to 1.18.20 as transitive dependency of Spring boot. Similar to the issue mentioned below
google/error-prone#2575

Further investigation reveal that bug pattern "FallThrough" for lombok annotations (like @Singular) could be a false positive, because Lombok  modifies the AST on the fly causing trouble to errorprone checks, as mentioned in below issue and PR.
google/error-prone#613
google/error-prone#1573

Considering the above points, we can suppress warning of "FallThrough" bug pattern reported by errorprone for @Builder/@Singular annotations.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants