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

AIOOBE in ProblemReporter.invalidType() #286

Closed
iloveeclipse opened this issue Aug 2, 2022 · 3 comments · Fixed by #289
Closed

AIOOBE in ProblemReporter.invalidType() #286

iloveeclipse opened this issue Aug 2, 2022 · 3 comments · Fixed by #289
Assignees
Labels
bug Something isn't working fix verified The implemented fix has been verified with an I-build
Milestone

Comments

@iloveeclipse
Copy link
Member

iloveeclipse commented Aug 2, 2022

Most recent SDK build as of today (but can be reproduced on 4.21 too).
Right click org.eclipse.jdt.internal.compiler.batch.ClasspathJar.file field and say "Open Call Hierarchy".
"Call Hierarchy" view will be empty but an error will be reported to the log.

Opening call hierarchy on other fields in same class seem to work fine.

eclipse.buildId=4.25.0.I20220801-1800
java.version=17.0.4
java.vendor=Eclipse Adoptium
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US
Command-line arguments:  -data /data/4x_platform_workspace -os linux -ws gtk -arch x86_64

org.eclipse.jdt.ui
Error
Tue Aug 02 14:30:26 CEST 2022
Internal Error

java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 2
	at org.eclipse.jdt.internal.compiler.problem.ProblemReporter.invalidType(ProblemReporter.java:4915)
	at org.eclipse.jdt.internal.compiler.ast.TypeReference.reportInvalidType(TypeReference.java:593)
	at org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference.internalResolveLeafType(ParameterizedQualifiedTypeReference.java:223)
	at org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference.internalResolveType(ParameterizedQualifiedTypeReference.java:206)
	at org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference.resolveType(ParameterizedQualifiedTypeReference.java:472)
	at org.eclipse.jdt.internal.compiler.ast.TypeReference.resolveType(TypeReference.java:621)
	at org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.resolveTypesWithSuspendedTempErrorHandlingPolicy(SourceTypeBinding.java:2803)
	at org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.resolveTypesFor(SourceTypeBinding.java:2705)
	at org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.methods(SourceTypeBinding.java:2276)
	at org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.getMethods(SourceTypeBinding.java:1914)
	at org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding.getMethods(ReferenceBinding.java:1159)
	at org.eclipse.jdt.internal.compiler.lookup.Scope.findMethod0(Scope.java:1696)
	at org.eclipse.jdt.internal.compiler.lookup.Scope.findMethod(Scope.java:1658)
	at org.eclipse.jdt.internal.compiler.lookup.Scope.getImplicitMethod(Scope.java:2624)
	at org.eclipse.jdt.internal.compiler.ast.MessageSend.resolveType(MessageSend.java:802)
	at org.eclipse.jdt.internal.compiler.ast.LocalDeclaration.resolve(LocalDeclaration.java:390)
	at org.eclipse.jdt.internal.compiler.ast.LocalDeclaration.resolve(LocalDeclaration.java:259)
	at org.eclipse.jdt.internal.compiler.ast.Block.resolve(Block.java:131)
	at org.eclipse.jdt.internal.compiler.ast.IfStatement.resolveIfStatement(IfStatement.java:291)
	at org.eclipse.jdt.internal.compiler.ast.IfStatement.resolve(IfStatement.java:317)
	at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolveStatements(AbstractMethodDeclaration.java:661)
	at org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.resolveStatements(MethodDeclaration.java:388)
	at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolve(AbstractMethodDeclaration.java:570)
	at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1503)
	at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1628)
	at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.resolve(CompilationUnitDeclaration.java:667)
	at org.eclipse.jdt.internal.core.search.matching.MatchLocator.process(MatchLocator.java:2030)
	at org.eclipse.jdt.internal.core.search.matching.MatchLocator.locateMatches(MatchLocator.java:1360)
	at org.eclipse.jdt.internal.core.search.matching.MatchLocator.locateMatches(MatchLocator.java:1397)
	at org.eclipse.jdt.internal.core.search.matching.MatchLocator.locateMatches(MatchLocator.java:1539)
	at org.eclipse.jdt.internal.core.search.JavaSearchParticipant.locateMatches(JavaSearchParticipant.java:135)
	at org.eclipse.jdt.internal.core.search.BasicSearchEngine.findMatches(BasicSearchEngine.java:251)
	at org.eclipse.jdt.internal.core.search.BasicSearchEngine.search(BasicSearchEngine.java:602)
	at org.eclipse.jdt.core.search.SearchEngine.search(SearchEngine.java:670)
	at org.eclipse.jdt.internal.corext.callhierarchy.CallerMethodWrapper.findChildren(CallerMethodWrapper.java:155)
	at org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper.performSearch(MethodWrapper.java:266)
	at org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper.doFindChildren(MethodWrapper.java:197)
	at org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper.getCalls(MethodWrapper.java:88)
	at org.eclipse.jdt.internal.ui.callhierarchy.DeferredMethodWrapper.getCalls(DeferredMethodWrapper.java:70)
	at org.eclipse.jdt.internal.ui.callhierarchy.DeferredMethodWrapper.fetchDeferredChildren(DeferredMethodWrapper.java:78)
	at org.eclipse.ui.progress.DeferredTreeContentManager$1.run(DeferredTreeContentManager.java:219)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
@trancexpress
Copy link
Contributor

trancexpress commented Aug 3, 2022

The code that throws:

		if (type instanceof ReferenceBinding) {
			char[][] name = ((ReferenceBinding) type).compoundName;
			end = (int) ref.sourcePositions[name.length - 1];
		}

The values that I see when the AIOOBE is (about to be) thrown:

type is:

ProblemType:[compoundName=java.nio.file.DirectoryStream][problemID=ProblemReasons.Ambiguous][closestMatch=public interface java.nio.file.DirectoryStream<T extends java.lang.Object>
	extends java.lang.Object
	implements : java.io.Closeable, Iterable<T>
/*   methods   */
[unresolved] public abstract Iterator<T> iterator() 
/*   members   */
public static interface Filter#RAW
	extends NULL TYPENULL SUPERINTERFACES
	enclosing type : java.nio.file.DirectoryStream<T>NULL FIELDSNULL METHODS
]

ref is:

DirectoryStream.Filter<? super Path>

ref.sourcePositions is:

[59283433600505, 59352153077248]

Maybe created here? I'm not 100% sure:

"Worker-170: Fetching children of file" #278 prio=5 os_prio=0 cpu=1298.90ms elapsed=544.04s tid=0x00007ffd54012800 nid=0x7d51 at breakpoint [0x00007ffdd5888000]
   java.lang.Thread.State: RUNNABLE
        at org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference.<init>(QualifiedTypeReference.java:30)
        at org.eclipse.jdt.internal.compiler.ast.ArrayQualifiedTypeReference.<init>(ArrayQualifiedTypeReference.java:30)
        at org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference.<init>(ParameterizedQualifiedTypeReference.java:50)
        at org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference.<init>(ParameterizedQualifiedTypeReference.java:65)
        at org.eclipse.jdt.internal.compiler.parser.Parser.getTypeReferenceForGenericType(Parser.java:12297)
        at org.eclipse.jdt.internal.compiler.parser.Parser.getTypeReference(Parser.java:12177)
        at org.eclipse.jdt.internal.core.search.matching.MatchLocatorParser.getTypeReference(MatchLocatorParser.java:983)
        at org.eclipse.jdt.internal.compiler.parser.Parser.consumeInterfaceType(Parser.java:4899)
        at org.eclipse.jdt.internal.core.search.matching.MatchLocatorParser.consumeInterfaceType(MatchLocatorParser.java:429)
        at org.eclipse.jdt.internal.compiler.parser.Parser.consumeRule(Parser.java:7125)
        at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:13081)
        at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:13336)
        at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:13293)
        at org.eclipse.jdt.internal.compiler.parser.Parser.dietParse(Parser.java:11679)
        at org.eclipse.jdt.internal.core.search.matching.MatchLocator.parseAndBuildBindings(MatchLocator.java:1939)
        at org.eclipse.jdt.internal.core.search.matching.MatchLocator.locateMatches(MatchLocator.java:1296)
        at org.eclipse.jdt.internal.core.search.matching.MatchLocator.locateMatches(MatchLocator.java:1397)
        at org.eclipse.jdt.internal.core.search.matching.MatchLocator.locateMatches(MatchLocator.java:1539)
        at org.eclipse.jdt.internal.core.search.JavaSearchParticipant.locateMatches(JavaSearchParticipant.java:135)
        at org.eclipse.jdt.internal.core.search.BasicSearchEngine.findMatches(BasicSearchEngine.java:251)
        at org.eclipse.jdt.internal.core.search.BasicSearchEngine.search(BasicSearchEngine.java:602)
        at org.eclipse.jdt.core.search.SearchEngine.search(SearchEngine.java:670)
        at org.eclipse.jdt.internal.corext.callhierarchy.CallerMethodWrapper.findChildren(CallerMethodWrapper.java:155)
        at org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper.performSearch(MethodWrapper.java:266)
        at org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper.doFindChildren(MethodWrapper.java:197)
        at org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper.getCalls(MethodWrapper.java:88)
        at org.eclipse.jdt.internal.ui.callhierarchy.DeferredMethodWrapper.getCalls(DeferredMethodWrapper.java:70)
        at org.eclipse.jdt.internal.ui.callhierarchy.DeferredMethodWrapper.fetchDeferredChildren(DeferredMethodWrapper.java:78)
        at org.eclipse.ui.progress.DeferredTreeContentManager$1.run(DeferredTreeContentManager.java:219)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

So one is not a qualified type name, the other is. I assume that is where the bad index is coming from. Will have to check why one is qualified and the other is not...

Weird that the object that doesn't have qualified tokens field is actually of type ParameterizedQualifiedTypeReference... The name implies it should be qualified...

The other (qualified) type is created here:

"Worker-177: Fetching children of file" #322 prio=5 os_prio=0 cpu=1309.41ms elapsed=450.45s tid=0x00007ffe1c005800 nid=0x9837 at breakpoint [0x00007fff241a4000]
   java.lang.Thread.State: RUNNABLE
        at org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding.<init>(ProblemReferenceBinding.java:29)
        at org.eclipse.jdt.internal.compiler.lookup.SplitPackageBinding.getType(SplitPackageBinding.java:244)
        at org.eclipse.jdt.internal.compiler.lookup.Scope.findType(Scope.java:2027)
        at org.eclipse.jdt.internal.compiler.lookup.Scope.getTypeOrPackage(Scope.java:3502)
        at org.eclipse.jdt.internal.compiler.lookup.Scope.getType(Scope.java:3189)
        at org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference.internalResolveLeafType(ParameterizedSingleTypeReference.java:200)
        at org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference.internalResolveType(ParameterizedSingleTypeReference.java:174)
        at org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference.resolveType(ParameterizedSingleTypeReference.java:395)
        at org.eclipse.jdt.internal.compiler.ast.TypeReference.resolveType(TypeReference.java:630)
        at org.eclipse.jdt.internal.compiler.ast.TypeReference.resolveSuperType(TypeReference.java:602)
        at org.eclipse.jdt.internal.compiler.lookup.ClassScope.findSupertype(ClassScope.java:1670)
        at org.eclipse.jdt.internal.compiler.lookup.ClassScope.connectSuperInterfaces(ClassScope.java:1393)
        at org.eclipse.jdt.internal.compiler.lookup.ClassScope.connectTypeHierarchy(ClassScope.java:1455)
        at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.connectTypeHierarchy(CompilationUnitScope.java:367)
        at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.completeTypeBindings(LookupEnvironment.java:518)
        at org.eclipse.jdt.internal.core.search.matching.MatchLocator.locateMatches(MatchLocator.java:1335)
        at org.eclipse.jdt.internal.core.search.matching.MatchLocator.locateMatches(MatchLocator.java:1397)
        at org.eclipse.jdt.internal.core.search.matching.MatchLocator.locateMatches(MatchLocator.java:1539)
        at org.eclipse.jdt.internal.core.search.JavaSearchParticipant.locateMatches(JavaSearchParticipant.java:135)
        at org.eclipse.jdt.internal.core.search.BasicSearchEngine.findMatches(BasicSearchEngine.java:251)
        at org.eclipse.jdt.internal.core.search.BasicSearchEngine.search(BasicSearchEngine.java:602)
        at org.eclipse.jdt.core.search.SearchEngine.search(SearchEngine.java:670)
        at org.eclipse.jdt.internal.corext.callhierarchy.CallerMethodWrapper.findChildren(CallerMethodWrapper.java:155)
        at org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper.performSearch(MethodWrapper.java:266)
        at org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper.doFindChildren(MethodWrapper.java:197)
        at org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper.getCalls(MethodWrapper.java:88)
        at org.eclipse.jdt.internal.ui.callhierarchy.DeferredMethodWrapper.getCalls(DeferredMethodWrapper.java:70)
        at org.eclipse.jdt.internal.ui.callhierarchy.DeferredMethodWrapper.fetchDeferredChildren(DeferredMethodWrapper.java:78)
        at org.eclipse.ui.progress.DeferredTreeContentManager$1.run(DeferredTreeContentManager.java:219)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

(or a similar stack trace, still a problem binding due to "split packages")

Actually I noticed the two types are different:

DirectoryStream.Filter (location)
java.nio.file.DirectoryStream<T> (type)

@trancexpress
Copy link
Contributor

See this index check, added quite a while near the same code: cf7db1b#diff-fd23cf7032143d2ba23d68639ebe308a164cc8d86477e7e4598bca7291dfd71bR3322

trancexpress added a commit to trancexpress/eclipse.jdt.core that referenced this issue Aug 3, 2022
This change adds index changes for ParameterizedQualifiedTypeReference
and ArrayQualifiedTypeReference in ProblemReporter.invalidType(),
similar to the existing index check for QualifiedTypeReference in the
same method.

Fixes: eclipse-jdt#286
@iloveeclipse iloveeclipse self-assigned this Aug 3, 2022
@iloveeclipse iloveeclipse added the bug Something isn't working label Aug 3, 2022
@iloveeclipse iloveeclipse added this to the 4.25 M3 milestone Aug 3, 2022
@iloveeclipse iloveeclipse added the fix verified The implemented fix has been verified with an I-build label Aug 4, 2022
@iloveeclipse
Copy link
Member Author

Works fine on I20220804-0700

gerking pushed a commit to gerking/eclipse.jdt.core that referenced this issue Aug 17, 2022
This change adds index changes for ParameterizedQualifiedTypeReference
and ArrayQualifiedTypeReference in ProblemReporter.invalidType(),
similar to the existing index check for QualifiedTypeReference in the
same method.

Fixes: eclipse-jdt#286
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working fix verified The implemented fix has been verified with an I-build
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants