apache / apache/netbeans

StackOverflowError during "Find Usages"

Aperta
#7,331 7 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Java kind:bug nb-javac
Lingua principale
Java
Stelle
3.1k
Fork
935
Merge medio
2g 3h
PR unite (30g)
17

Descrizione

### Apache NetBeans version

Apache NetBeans 22 release candidate

### What happened

Most likely due to https://github.com/apache/netbeans/pull/7153, a StackOverflowError happens when I select "Find Usages" on certain methods of our rather large Java project. As a result, no usages are found, even though there are many. It happens so many times that NetBeans is nearly unusable. As I like NB so much, I often fall back to the text-based "Find...", but that is not a decent replacement obviously.

Note that it is not really worse as compared to before https://github.com/apache/netbeans/pull/7153. Before, the same `NullPointerException: Cannot invoke "com.sun.tools.javac.code.Type.getThrownTypes() because "tree.meth.type" is null` error occurred as in https://github.com/apache/netbeans/issues/3725 but during "Find Usages". https://github.com/apache/netbeans/issues/3725 was supposed to be fixed by https://github.com/apache/netbeans/pull/7153.

It started about 2 years ago (I am always using the most recent NB version) but got worse and worse over time. Not sure if that was due to NB, changes in our code or both.

### Language / Project Type / NetBeans Component

Java multi-module Maven project

### How to reproduce

I created this issue as a heads-up to show probable consequences of https://github.com/apache/netbeans/pull/7153. I cannot send our code as it's proprietary and too large.

I will try to identify the culprit (I think it's about generics) and write simple classes to reproduce next.

### Did this work correctly in an earlier version?

No / Don't know

### Operating System

Windows 11

### JDK

Oracle JDK 11.0.22 for the project, Amazon Corretto OpenJDK 17.0.10 for NetBeans

### Apache NetBeans packaging

Apache NetBeans binary zip

### Anything else

The exception details are:
```
java.lang.IllegalStateException: java.lang.StackOverflowError
at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:383)
at org.netbeans.modules.java.source.parsing.JavacParser.moveToPhase(JavacParser.java:765)
at org.netbeans.modules.java.source.parsing.CompilationInfoImpl.toPhase(CompilationInfoImpl.java:426)
at org.netbeans.api.java.source.CompilationController.toPhase(CompilationController.java:90)
at org.netbeans.modules.refactoring.java.plugins.JavaWhereUsedQueryPlugin$FindTask.run(JavaWhereUsedQueryPlugin.java:562)
at org.netbeans.modules.refactoring.java.plugins.JavaWhereUsedQueryPlugin$FindTask.run(JavaWhereUsedQueryPlugin.java:540)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.lambda$processFiles$2(JavaRefactoringPlugin.java:330)
at org.netbeans.api.java.source.JavaSource$MultiTask.run(JavaSource.java:504)
at org.netbeans.modules.parsing.impl.TaskProcessor.callUserTask(TaskProcessor.java:586)
at org.netbeans.modules.parsing.api.ParserManager$MultiUserTaskAction.run(ParserManager.java:235)
at org.netbeans.modules.parsing.api.ParserManager$MultiUserTaskAction.run(ParserManager.java:205)
at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:181)
at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:178)
at org.netbeans.modules.masterfs.filebasedfs.utils.FileChangedManager.priorityIO(FileChangedManager.java:153)
at org.netbeans.modules.masterfs.providers.ProvidedExtensions.priorityIO(ProvidedExtensions.java:335)
at org.netbeans.modules.parsing.nb.DataObjectEnvFactory.runPriorityIO(DataObjectEnvFactory.java:118)
at org.netbeans.modules.parsing.impl.Utilities.runPriorityIO(Utilities.java:67)
at org.netbeans.modules.parsing.impl.TaskProcessor.runUserTask(TaskProcessor.java:178)
at org.netbeans.modules.parsing.api.ParserManager.parse(ParserManager.java:85)
at org.netbeans.api.java.source.JavaSource.runUserActionTaskImpl(JavaSource.java:454)
at org.netbeans.api.java.source.JavaSource.runUserActionTask(JavaSource.java:425)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.processFiles(JavaRefactoringPlugin.java:328)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.processFiles(JavaRefactoringPlugin.java:264)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.queryFiles(JavaRefactoringPlugin.java:254)
at org.netbeans.modules.refactoring.java.plugins.JavaWhereUsedQueryPlugin.prepare(JavaWhereUsedQueryPlugin.java:353)
at org.netbeans.modules.refactoring.api.AbstractRefactoring.pluginsPrepare2(AbstractRefactoring.java:417)
at org.netbeans.modules.refactoring.api.AbstractRefactoring.pluginsPrepare(AbstractRefactoring.java:401)
at org.netbeans.modules.refactoring.api.AbstractRefactoring.prepare(AbstractRefactoring.java:212)
at org.netbeans.modules.refactoring.spi.impl.ParametersPanel$Prepare$2.run(ParametersPanel.java:1059)
at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1420)
at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45)
at org.openide.util.lookup.Lookups.executeWith(Lookups.java:287)
at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2035)
Caused by: java.lang.StackOverflowError
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1082)
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1074)
at com.sun.tools.javac.code.Types.isSuperType(Types.java:1301)
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1083)
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1074)
at com.sun.tools.javac.code.Types.isSuperType(Types.java:1301)
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1083)
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1074)
at com.sun.tools.javac.code.Types.isSuperType(Types.java:1301)
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1083)
at com.sun.tools.javac.code.Types.isSubtype(Types.java:1074)
at com.sun.tools.javac.code.Types.isSuperType(Types.java:1301)
...
```

With NetBeans 21, it was:
```
java.lang.IllegalStateException: java.lang.NullPointerException: Cannot invoke "com.sun.tools.javac.code.Type.getThrownTypes()" because "tree.meth.type" is null
at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:383)
at org.netbeans.modules.java.source.parsing.JavacParser.moveToPhase(JavacParser.java:765)
at org.netbeans.modules.java.source.parsing.CompilationInfoImpl.toPhase(CompilationInfoImpl.java:426)
at org.netbeans.api.java.source.CompilationController.toPhase(CompilationController.java:90)
at org.netbeans.modules.refactoring.java.plugins.JavaWhereUsedQueryPlugin$FindTask.run(JavaWhereUsedQueryPlugin.java:562)
at org.netbeans.modules.refactoring.java.plugins.JavaWhereUsedQueryPlugin$FindTask.run(JavaWhereUsedQueryPlugin.java:540)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.lambda$processFiles$2(JavaRefactoringPlugin.java:330)
at org.netbeans.api.java.source.JavaSource$MultiTask.run(JavaSource.java:504)
at org.netbeans.modules.parsing.impl.TaskProcessor.callUserTask(TaskProcessor.java:586)
at org.netbeans.modules.parsing.api.ParserManager$MultiUserTaskAction.run(ParserManager.java:169)
at org.netbeans.modules.parsing.api.ParserManager$MultiUserTaskAction.run(ParserManager.java:140)
at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:181)
at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:178)
at org.netbeans.modules.masterfs.filebasedfs.utils.FileChangedManager.priorityIO(FileChangedManager.java:153)
at org.netbeans.modules.masterfs.providers.ProvidedExtensions.priorityIO(ProvidedExtensions.java:335)
at org.netbeans.modules.parsing.nb.DataObjectEnvFactory.runPriorityIO(DataObjectEnvFactory.java:118)
at org.netbeans.modules.parsing.impl.Utilities.runPriorityIO(Utilities.java:67)
at org.netbeans.modules.parsing.impl.TaskProcessor.runUserTask(TaskProcessor.java:178)
at org.netbeans.modules.parsing.api.ParserManager.parse(ParserManager.java:85)
at org.netbeans.api.java.source.JavaSource.runUserActionTaskImpl(JavaSource.java:454)
at org.netbeans.api.java.source.JavaSource.runUserActionTask(JavaSource.java:425)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.processFiles(JavaRefactoringPlugin.java:328)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.processFiles(JavaRefactoringPlugin.java:264)
at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.queryFiles(JavaRefactoringPlugin.java:254)
at org.netbeans.modules.refactoring.java.plugins.JavaWhereUsedQueryPlugin.prepare(JavaWhereUsedQueryPlugin.java:353)
at org.netbeans.modules.refactoring.api.AbstractRefactoring.pluginsPrepare2(AbstractRefactoring.java:417)
at org.netbeans.modules.refactoring.api.AbstractRefactoring.pluginsPrepare(AbstractRefactoring.java:401)
at org.netbeans.modules.refactoring.api.AbstractRefactoring.prepare(AbstractRefactoring.java:212)
at org.netbeans.modules.refactoring.spi.impl.ParametersPanel$Prepare$2.run(ParametersPanel.java:1059)
at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1420)
at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45)
at org.openide.util.lookup.Lookups.executeWith(Lookups.java:287)
at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2035)
Caused by: java.lang.NullPointerException: Cannot invoke "com.sun.tools.javac.code.Type.getThrownTypes()" because "tree.meth.type" is null
at com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitApply(Flow.java:1769)
at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1816)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:455)
at com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitReturn(Flow.java:1745)
at com.sun.tools.javac.tree.JCTree$JCReturn.accept(JCTree.java:1728)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:455)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:58)
at com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitBlock(Flow.java:1494)
at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1092)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:455)
at com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitMethodDef(Flow.java:1460)
at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:916)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:455)
at com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitClassDef(Flow.java:1423)
at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:814)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:50)
at com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:455)
at com.sun.tools.javac.comp.Flow$FlowAnalyzer.analyzeTree(Flow.java:1862)
at com.sun.tools.javac.comp.Flow$FlowAnalyzer.analyzeTree(Flow.java:1852)
at com.sun.tools.javac.comp.Flow.analyzeTree(Flow.java:231)
at com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1419)
at com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1383)
at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:404)
at com.sun.tools.javac.api.JavacTaskImpl.lambda$analyze$1(JavacTaskImpl.java:379)
at com.sun.tools.javac.api.JavacTaskImpl.invocationHelper(JavacTaskImpl.java:152)
at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:379)
... 32 more
```

### Are you willing to submit a pull request?

No

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia da JavaWhereUsedQueryPlugin$FindTask e segui lo stack attraverso JavacParser.moveToPhase e CompilationInfoImpl.toPhase. Riproduci il problema con un progetto Java minimale, concentrandoti sullo scenario dei tipi generici segnalato; il lavoro è completato quando Find Usages termina senza StackOverflowError e segnala gli utilizzi invece di fallire.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
java
Ambito
tooling
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
32/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.