-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Closed
Labels
a:bugPMD crashes or fails to analyse a file.PMD crashes or fails to analyse a file.
Milestone
Description
Hello!
There is a bug in javac https://bugs.openjdk.org/browse/JDK-8372382 related to incorrect RuntimeVisibleTypeAnnotations section in byte code - in some edge situations javac generates constructor marked with FIELD annotation instead of METHOD_FORMAL_PARAMETER annotation.
reproducer code:
package demo;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public record RuntimeVisibleTypeAnnotationsOuter(
Id id
) {
public RuntimeVisibleTypeAnnotationsOuter {
}
public record Id(
String id
) {
}
public record Inner(
Id id
) {
public Inner {
}
public record Id(
@Anno String value,
RuntimeVisibleTypeAnnotationsOuter.@Anno Id outerId
) {
public Id {
}
}
}
@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {
}
}If there is any code that uses RuntimeVisibleTypeAnnotationsOuter.Inner.Id, then pmd-mavn-plugin + PMD will log something like
[ERROR] Parsing failed in ParseLock#doParse()
org.apache.commons.lang3.exception.ContextedRuntimeException: java.lang.IllegalArgumentException: Invalid target type of type annotation @demo.RuntimeVisibleTypeAnnotationsOuter.Anno for method or ctor type annotation: 19
---------------------------------
at net.sourceforge.pmd.util.AssertionUtil.contexted (AssertionUtil.java:257)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1.doParse (GenericSigBase.java:62)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus (ParseLock.java:62)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.ensureParsed (ParseLock.java:29)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.ensureParsed (GenericSigBase.java:92)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.getTypeParams (GenericSigBase.java:112)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ExecutableStub.getTypeParameters (ExecutableStub.java:60)
at net.sourceforge.pmd.lang.java.types.ClassMethodSigImpl.getTypeParameters (ClassMethodSigImpl.java:121)
at net.sourceforge.pmd.lang.java.types.JMethodSig.isGeneric (JMethodSig.java:161)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.isPotentiallyApplicable (Infer.java:1024)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.computeCompileTimeDecl (Infer.java:302)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.getCompileTimeDecl (Infer.java:279)
at net.sourceforge.pmd.lang.java.types.internal.infer.ast.BaseInvocMirror.getStandaloneCtdecl (BaseInvocMirror.java:82)
at net.sourceforge.pmd.lang.java.types.internal.infer.ast.CtorInvocMirror.finishStandaloneInference (CtorInvocMirror.java:61)
at net.sourceforge.pmd.lang.java.types.internal.infer.ExprCheckHelper.isCompatible (ExprCheckHelper.java:103)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addBoundOrDefer (Infer.java:945)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addArgsConstraints (Infer.java:903)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMaybeNoInfer (Infer.java:531)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethod (Infer.java:415)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateConstructor (Infer.java:446)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethodOrCtor (Infer.java:394)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.logInference (Infer.java:377)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.computeCompileTimeDecl (Infer.java:317)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.getCompileTimeDecl (Infer.java:279)
at net.sourceforge.pmd.lang.java.types.internal.infer.ast.BaseInvocMirror.getStandaloneCtdecl (BaseInvocMirror.java:82)
at net.sourceforge.pmd.lang.java.types.internal.infer.ast.CtorInvocMirror.finishStandaloneInference (CtorInvocMirror.java:61)
at net.sourceforge.pmd.lang.java.types.internal.infer.ExprCheckHelper.isCompatible (ExprCheckHelper.java:103)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addBoundOrDefer (Infer.java:945)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addArgsConstraints (Infer.java:903)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateImpl (Infer.java:593)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMaybeNoInfer (Infer.java:571)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethod (Infer.java:415)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethodOrCtor (Infer.java:395)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.logInference (Infer.java:377)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.computeCompileTimeDecl (Infer.java:317)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.getCompileTimeDecl (Infer.java:279)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.goToInvocationWithFallback (Infer.java:208)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.inferInvocationRecursively (Infer.java:170)
at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.inferInvocation (PolyResolution.java:263)
at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.polyTypeOtherCtx (PolyResolution.java:135)
at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.computePolyType (PolyResolution.java:125)
at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.handlePoly (LazyTypeResolver.java:360)
at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.visit (LazyTypeResolver.java:365)
at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.visit (LazyTypeResolver.java:103)
at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.acceptVisitor (ASTMethodCall.java:71)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaTypeNode.getTypeMirror (AbstractJavaTypeNode.java:51)
at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.getTypeMirror (ASTMethodCall.java:22)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaTypeNode.getTypeMirror (AbstractJavaTypeNode.java:39)
at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.getTypeMirror (ASTMethodCall.java:22)
at net.sourceforge.pmd.lang.java.ast.InternalApiBridge.lambda$forceTypeResolutionPhase$0 (InternalApiBridge.java:92)
at java.util.Iterator.forEachRemaining (Iterator.java:133)
at net.sourceforge.pmd.lang.ast.internal.IteratorBasedNStream.forEach (IteratorBasedNStream.java:102)
at net.sourceforge.pmd.lang.java.ast.InternalApiBridge.forceTypeResolutionPhase (InternalApiBridge.java:90)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.lambda$process$3 (JavaAstProcessor.java:140)
at net.sourceforge.pmd.benchmark.TimeTracker.bench (TimeTracker.java:163)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process (JavaAstProcessor.java:140)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process (JavaAstProcessor.java:171)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process (JavaAstProcessor.java:155)
at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl (JavaParser.java:70)
at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl (JavaParser.java:25)
at net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeParserAdapter.parse (JjtreeParserAdapter.java:36)
at net.sourceforge.pmd.lang.impl.PmdRunnable.parse (PmdRunnable.java:112)
at net.sourceforge.pmd.lang.impl.PmdRunnable.processSource (PmdRunnable.java:132)
at net.sourceforge.pmd.lang.impl.PmdRunnable.run (PmdRunnable.java:80)
at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:545)
at java.util.concurrent.FutureTask.run (FutureTask.java:328)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1090)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:614)
at java.lang.Thread.run (Thread.java:1474)
Caused by: java.lang.IllegalArgumentException: Invalid target type of type annotation @demo.RuntimeVisibleTypeAnnotationsOuter.Anno for method or ctor type annotation: 19
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.acceptAnnotationAfterParse (GenericSigBase.java:426)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeAnnotationHelper$TypeAnnotationSetWithReferences.forEach (TypeAnnotationHelper.java:71)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.doParse (GenericSigBase.java:288)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1.doParse (GenericSigBase.java:59)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus (ParseLock.java:62)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.ensureParsed (ParseLock.java:29)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.ensureParsed (GenericSigBase.java:92)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.getTypeParams (GenericSigBase.java:112)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ExecutableStub.getTypeParameters (ExecutableStub.java:60)
at net.sourceforge.pmd.lang.java.types.ClassMethodSigImpl.getTypeParameters (ClassMethodSigImpl.java:121)
at net.sourceforge.pmd.lang.java.types.JMethodSig.isGeneric (JMethodSig.java:161)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.isPotentiallyApplicable (Infer.java:1024)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.computeCompileTimeDecl (Infer.java:302)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.getCompileTimeDecl (Infer.java:279)
at net.sourceforge.pmd.lang.java.types.internal.infer.ast.BaseInvocMirror.getStandaloneCtdecl (BaseInvocMirror.java:82)
at net.sourceforge.pmd.lang.java.types.internal.infer.ast.CtorInvocMirror.finishStandaloneInference (CtorInvocMirror.java:61)
at net.sourceforge.pmd.lang.java.types.internal.infer.ExprCheckHelper.isCompatible (ExprCheckHelper.java:103)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addBoundOrDefer (Infer.java:945)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addArgsConstraints (Infer.java:903)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMaybeNoInfer (Infer.java:531)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethod (Infer.java:415)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateConstructor (Infer.java:446)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethodOrCtor (Infer.java:394)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.logInference (Infer.java:377)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.computeCompileTimeDecl (Infer.java:317)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.getCompileTimeDecl (Infer.java:279)
at net.sourceforge.pmd.lang.java.types.internal.infer.ast.BaseInvocMirror.getStandaloneCtdecl (BaseInvocMirror.java:82)
at net.sourceforge.pmd.lang.java.types.internal.infer.ast.CtorInvocMirror.finishStandaloneInference (CtorInvocMirror.java:61)
at net.sourceforge.pmd.lang.java.types.internal.infer.ExprCheckHelper.isCompatible (ExprCheckHelper.java:103)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addBoundOrDefer (Infer.java:945)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.addArgsConstraints (Infer.java:903)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateImpl (Infer.java:593)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMaybeNoInfer (Infer.java:571)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethod (Infer.java:415)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethodOrCtor (Infer.java:395)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.logInference (Infer.java:377)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.computeCompileTimeDecl (Infer.java:317)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.getCompileTimeDecl (Infer.java:279)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.goToInvocationWithFallback (Infer.java:208)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.inferInvocationRecursively (Infer.java:170)
at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.inferInvocation (PolyResolution.java:263)
at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.polyTypeOtherCtx (PolyResolution.java:135)
at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.computePolyType (PolyResolution.java:125)
at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.handlePoly (LazyTypeResolver.java:360)
at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.visit (LazyTypeResolver.java:365)
at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.visit (LazyTypeResolver.java:103)
at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.acceptVisitor (ASTMethodCall.java:71)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaTypeNode.getTypeMirror (AbstractJavaTypeNode.java:51)
at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.getTypeMirror (ASTMethodCall.java:22)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaTypeNode.getTypeMirror (AbstractJavaTypeNode.java:39)
at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.getTypeMirror (ASTMethodCall.java:22)
at net.sourceforge.pmd.lang.java.ast.InternalApiBridge.lambda$forceTypeResolutionPhase$0 (InternalApiBridge.java:92)
at java.util.Iterator.forEachRemaining (Iterator.java:133)
at net.sourceforge.pmd.lang.ast.internal.IteratorBasedNStream.forEach (IteratorBasedNStream.java:102)
at net.sourceforge.pmd.lang.java.ast.InternalApiBridge.forceTypeResolutionPhase (InternalApiBridge.java:90)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.lambda$process$3 (JavaAstProcessor.java:140)
at net.sourceforge.pmd.benchmark.TimeTracker.bench (TimeTracker.java:163)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process (JavaAstProcessor.java:140)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process (JavaAstProcessor.java:171)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process (JavaAstProcessor.java:155)
at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl (JavaParser.java:70)
at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl (JavaParser.java:25)
at net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeParserAdapter.parse (JjtreeParserAdapter.java:36)
at net.sourceforge.pmd.lang.impl.PmdRunnable.parse (PmdRunnable.java:112)
at net.sourceforge.pmd.lang.impl.PmdRunnable.processSource (PmdRunnable.java:132)
at net.sourceforge.pmd.lang.impl.PmdRunnable.run (PmdRunnable.java:80)
at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:545)
at java.util.concurrent.FutureTask.run (FutureTask.java:328)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1090)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:614)
at java.lang.Thread.run (Thread.java:1474)
This is similar to #5344 , and probably warrants the same type of "fix" - log/warn about bogus FIELD annotation.
Metadata
Metadata
Assignees
Labels
a:bugPMD crashes or fails to analyse a file.PMD crashes or fails to analyse a file.