Affects PMD Version: at least 7.11.0 to 7.17.0 (older versions fail on #5442 and/or #5096 in our codebase)
Description:
I'm trying to upgrade PMD from 6.55 in our codebase. I started out with 7.3.0 but got a StackOverflowError that was reported in #5096 and fixed in 7.9.0. After that a new StackOverflowError popped up (reported as #5442 and fixed in 7.11.0). Now I'm seeing a third StackOverflowError.
Exception Stacktrace:
[TRACE] Processing file (lang: java+version:24): /home/slovdahl/path/admin/api/ApiRestController.java
Exception in thread "main" java.lang.StackOverflowError
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.ensureParsed(ParseLock.java:29)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.getTypeParameters(ClassStub.java:310)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.getFormalTypeParams(ClassTypeImpl.java:148)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.visitClass(TypeOps.java:1180)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.visitClass(TypeOps.java:1147)
at net.sourceforge.pmd.lang.java.types.JClassType.acceptVisitor(JClassType.java:312)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitTypeVar(TypeOps.java:1039)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitTypeVar(TypeOps.java:1034)
at net.sourceforge.pmd.lang.java.types.JTypeVar.acceptVisitor(JTypeVar.java:103)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitWildcard(TypeOps.java:1047)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitWildcard(TypeOps.java:1034)
at net.sourceforge.pmd.lang.java.types.JWildcardType.acceptVisitor(JWildcardType.java:85)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.lambda$visitClass$0(TypeOps.java:1185)
at net.sourceforge.pmd.lang.java.types.TypeOps$RecursionStop.recurseIfNotDone(TypeOps.java:1124)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.visitClass(TypeOps.java:1185)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.visitClass(TypeOps.java:1147)
at net.sourceforge.pmd.lang.java.types.JClassType.acceptVisitor(JClassType.java:312)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitTypeVar(TypeOps.java:1039)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitTypeVar(TypeOps.java:1034)
at net.sourceforge.pmd.lang.java.types.JTypeVar.acceptVisitor(JTypeVar.java:103)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitWildcard(TypeOps.java:1047)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitWildcard(TypeOps.java:1034)
at net.sourceforge.pmd.lang.java.types.JWildcardType.acceptVisitor(JWildcardType.java:85)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.lambda$visitClass$0(TypeOps.java:1185)
at net.sourceforge.pmd.lang.java.types.TypeOps$RecursionStop.recurseIfNotDone(TypeOps.java:1124)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.visitClass(TypeOps.java:1185)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.visitClass(TypeOps.java:1147)
at net.sourceforge.pmd.lang.java.types.JClassType.acceptVisitor(JClassType.java:312)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitTypeVar(TypeOps.java:1039)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitTypeVar(TypeOps.java:1034)
at net.sourceforge.pmd.lang.java.types.JTypeVar.acceptVisitor(JTypeVar.java:103)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitWildcard(TypeOps.java:1047)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitWildcard(TypeOps.java:1034)
at net.sourceforge.pmd.lang.java.types.JWildcardType.acceptVisitor(JWildcardType.java:85)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.lambda$visitClass$0(TypeOps.java:1185)
at net.sourceforge.pmd.lang.java.types.TypeOps$RecursionStop.recurseIfNotDone(TypeOps.java:1124)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.visitClass(TypeOps.java:1185)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.visitClass(TypeOps.java:1147)
at net.sourceforge.pmd.lang.java.types.JClassType.acceptVisitor(JClassType.java:312)
// ... repeated over and over again ..
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitTypeVar(TypeOps.java:1039)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitTypeVar(TypeOps.java:1034)
at net.sourceforge.pmd.lang.java.types.JTypeVar.acceptVisitor(JTypeVar.java:103)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitWildcard(TypeOps.java:1047)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitWildcard(TypeOps.java:1034)
at net.sourceforge.pmd.lang.java.types.JWildcardType.acceptVisitor(JWildcardType.java:85)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.lambda$visitClass$0(TypeOps.java:1185)
at net.sourceforge.pmd.lang.java.types.TypeOps$RecursionStop.recurseIfNotDone(TypeOps.java:1124)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.visitClass(TypeOps.java:1185)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.visitClass(TypeOps.java:1147)
at net.sourceforge.pmd.lang.java.types.JClassType.acceptVisitor(JClassType.java:312)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitTypeVar(TypeOps.java:1039)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitTypeVar(TypeOps.java:1034)
at net.sourceforge.pmd.lang.java.types.JTypeVar.acceptVisitor(JTypeVar.java:103)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitWildcard(TypeOps.java:1047)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitWildcard(TypeOps.java:1034)
at net.sourceforge.pmd.lang.java.types.JWildcardType.acceptVisitor(JWildcardType.java:85)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.lambda$visitClass$0(TypeOps.java:1185)
at net.sourceforge.pmd.lang.java.types.TypeOps$RecursionStop.recurseIfNotDone(TypeOps.java:1124)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.visitClass(TypeOps.java:1185)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.visitClass(TypeOps.java:1147)
at net.sourceforge.pmd.lang.java.types.JClassType.acceptVisitor(JClassType.java:312)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitTypeVar(TypeOps.java:1039)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitTypeVar(TypeOps.java:1034)
at net.sourceforge.pmd.lang.java.types.JTypeVar.acceptVisitor(JTypeVar.java:103)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitWildcard(TypeOps.java:1047)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitWildcard(TypeOps.java:1034)
at net.sourceforge.pmd.lang.java.types.JWildcardType.acceptVisitor(JWildcardType.java:85)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.lambda$visitClass$0(TypeOps.java:1185)
at net.sourceforge.pmd.lang.java.types.TypeOps$RecursionStop.recurseIfNotDone(TypeOps.java:1124)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.visitClass(TypeOps.java:1185)
at net.sourceforge.pmd.lang.java.types.TypeOps$ProjectionVisitor.visitClass(TypeOps.java:1147)
at net.sourceforge.pmd.lang.java.types.JClassType.acceptVisitor(JClassType.java:312)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitTypeVar(TypeOps.java:1039)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitTypeVar(TypeOps.java:1034)
at net.sourceforge.pmd.lang.java.types.JTypeVar.acceptVisitor(JTypeVar.java:103)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitWildcard(TypeOps.java:1047)
at net.sourceforge.pmd.lang.java.types.TypeOps$1.visitWildcard(TypeOps.java:1034)
at net.sourceforge.pmd.lang.java.types.JWildcardType.acceptVisitor(JWildcardType.java:85)
[ERROR] Parsing failed in ParseLock#doParse() of ClassStub:com/google/common/collect/ImmutableList$Builder
java.io.IOException: While loading class from StreamLoader(for com/google/common/collect/ImmutableList$Builder)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1.doParse(ClassStub.java:103)
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.ClassStub.getModifiers(ClassStub.java:539)
at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.getDeclaredClass(ClassTypeImpl.java:339)
at net.sourceforge.pmd.lang.java.symbols.table.internal.JavaResolvers.getNamedMemberResolver(JavaResolvers.java:512)
at net.sourceforge.pmd.lang.java.symbols.table.internal.JavaResolvers.getMemberClassResolver(JavaResolvers.java:498)
at net.sourceforge.pmd.lang.java.symbols.table.internal.ReferenceCtx.findTypeMember(ReferenceCtx.java:76)
at net.sourceforge.pmd.lang.java.ast.AstDisambiguationPass.checkParentIsMember(AstDisambiguationPass.java:67)
at net.sourceforge.pmd.lang.java.ast.AstDisambiguationPass.access$000(AstDisambiguationPass.java:34)
at net.sourceforge.pmd.lang.java.ast.AstDisambiguationPass$DisambigVisitor.visit(AstDisambiguationPass.java:139)
at net.sourceforge.pmd.lang.java.ast.AstDisambiguationPass$DisambigVisitor.visit(AstDisambiguationPass.java:80)
at net.sourceforge.pmd.lang.java.ast.ASTAmbiguousName.acceptVisitor(ASTAmbiguousName.java:99)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
at net.sourceforge.pmd.lang.java.ast.AstDisambiguationPass$DisambigVisitor.visit(AstDisambiguationPass.java:157)
at net.sourceforge.pmd.lang.java.ast.AstDisambiguationPass$DisambigVisitor.visit(AstDisambiguationPass.java:80)
at net.sourceforge.pmd.lang.java.ast.ASTClassType.acceptVisitor(ASTClassType.java:157)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
at net.sourceforge.pmd.lang.java.ast.AstDisambiguationPass.lambda$disambigWithCtx$0(AstDisambiguationPass.java:58)
at net.sourceforge.pmd.lang.ast.internal.SingletonNodeStream.forEach(SingletonNodeStream.java:87)
at net.sourceforge.pmd.lang.java.ast.AstDisambiguationPass.disambigWithCtx(AstDisambiguationPass.java:58)
at net.sourceforge.pmd.lang.java.ast.InternalApiBridge.disambigWithCtx(InternalApiBridge.java:77)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymTableFactory.disambig(SymTableFactory.java:103)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visit(SymbolTableResolver.java:188)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visit(SymbolTableResolver.java:138)
at net.sourceforge.pmd.lang.java.ast.ASTClassType.acceptVisitor(ASTClassType.java:157)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitChildren(AstVisitorBase.java:31)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitNode(AstVisitorBase.java:38)
at net.sourceforge.pmd.lang.java.ast.JavaVisitor.visitJavaNode(JavaVisitor.java:7)
at net.sourceforge.pmd.lang.java.ast.JavaVisitorBase.visitStatement(JavaVisitorBase.java:288)
at net.sourceforge.pmd.lang.java.ast.JavaVisitorBase.visit(JavaVisitorBase.java:358)
at net.sourceforge.pmd.lang.java.ast.ASTLocalVariableDeclaration.acceptVisitor(ASTLocalVariableDeclaration.java:44)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor$StatementVisitor.visitStatement(SymbolTableResolver.java:594)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor$StatementVisitor.visitStatement(SymbolTableResolver.java:583)
at net.sourceforge.pmd.lang.java.ast.JavaVisitorBase.visit(JavaVisitorBase.java:358)
at net.sourceforge.pmd.lang.java.ast.ASTLocalVariableDeclaration.acceptVisitor(ASTLocalVariableDeclaration.java:44)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visitBlockLike(SymbolTableResolver.java:430)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visit(SymbolTableResolver.java:360)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visit(SymbolTableResolver.java:138)
at net.sourceforge.pmd.lang.java.ast.ASTBlock.acceptVisitor(ASTBlock.java:30)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitChildren(AstVisitorBase.java:31)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.setTopSymbolTableAndVisitAllChildren(SymbolTableResolver.java:741)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visitMethodOrCtor(SymbolTableResolver.java:326)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visitMethodOrCtor(SymbolTableResolver.java:138)
at net.sourceforge.pmd.lang.java.ast.JavaVisitorBase.visit(JavaVisitorBase.java:39)
at net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration.acceptVisitor(ASTMethodDeclaration.java:55)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitChildren(AstVisitorBase.java:31)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visitTypeDecl(SymbolTableResolver.java:296)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visitTypeDecl(SymbolTableResolver.java:138)
at net.sourceforge.pmd.lang.java.ast.JavaVisitorBase.visit(JavaVisitorBase.java:57)
at net.sourceforge.pmd.lang.java.ast.ASTClassDeclaration.acceptVisitor(ASTClassDeclaration.java:39)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitChildren(AstVisitorBase.java:31)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visit(SymbolTableResolver.java:247)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visit(SymbolTableResolver.java:138)
at net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit.acceptVisitor(ASTCompilationUnit.java:108)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.traverse(SymbolTableResolver.java:164)
at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver.traverse(SymbolTableResolver.java:101)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.lambda$process$1(JavaAstProcessor.java:132)
at net.sourceforge.pmd.benchmark.TimeTracker.bench(TimeTracker.java:163)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:132)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:166)
at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:150)
at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl(JavaParser.java:69)
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.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.io.IOException: Stream closed
at java.base/java.util.zip.InflaterInputStream.ensureOpen(InflaterInputStream.java:68)
at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:154)
at java.base/java.io.FilterInputStream.read(FilterInputStream.java:119)
at org.objectweb.asm.ClassReader.readStream(ClassReader.java:323)
at org.objectweb.asm.ClassReader.<init>(ClassReader.java:288)
at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1.doParse(ClassStub.java:94)
... 79 more
Code Sample demonstrating the issue:
I have spent some time trying to extract a minimal reproduce for this but no success yet. The ApiRestController.java that PMD fails on looks like this: ApiRestController.java. However, when running with PMD_JAVA_OPTS="-Dpmd.error_recovery" it fails on another file (AbstractAdminRestController) instead, that looks like this: AbstractAdminRestController.java.
Anything else that I could try/do/provide that would help pinning it down?
Ruleset:
<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="PMD ruleset"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
<description>PMD ruleset</description>
<rule ref="category/java/bestpractices.xml/MissingOverride"/>
<rule ref="category/java/bestpractices.xml/PrimitiveWrapperInstantiation"/>
<rule ref="category/java/bestpractices.xml/ReplaceVectorWithList"/>
<rule ref="category/java/bestpractices.xml/UseStandardCharsets"/>
<rule ref="category/java/bestpractices.xml/UseTryWithResources"/>
<rule ref="category/java/codestyle.xml/ExtendsObject"/>
<rule ref="category/java/codestyle.xml/PackageCase"/>
<rule ref="category/java/codestyle.xml/UnnecessaryCast"/>
<rule ref="category/java/codestyle.xml/UnnecessarySemicolon"/>
<rule ref="category/java/codestyle.xml/UseDiamondOperator"/>
<rule ref="category/java/errorprone.xml/AvoidDecimalLiteralsInBigDecimalConstructor" />
<rule ref="category/java/errorprone.xml/ClassCastExceptionWithToArray" />
<rule ref="category/java/errorprone.xml/IdempotentOperations" />
<rule ref="category/java/errorprone.xml/MissingSerialVersionUID" />
<rule ref="category/java/errorprone.xml/NonStaticInitializer" />
<rule ref="category/java/errorprone.xml/UseEqualsToCompareStrings" />
<rule ref="category/java/errorprone.xml/UselessOperationOnImmutable" />
<rule ref="category/java/multithreading.xml/DontCallThreadRun" />
</ruleset>
Steps to reproduce:
Please provide detailed steps for how we can reproduce the bug.
- TBD
Running PMD through: CLI and Gradle 8.14
- Java 21 (Temurin)
- Guava version 32.1.2-jre
- Spring 5.3.39
- Spring-HATEOAS 1.3.7
Affects PMD Version: at least 7.11.0 to 7.17.0 (older versions fail on #5442 and/or #5096 in our codebase)
Description:
I'm trying to upgrade PMD from 6.55 in our codebase. I started out with 7.3.0 but got a
StackOverflowErrorthat was reported in #5096 and fixed in 7.9.0. After that a newStackOverflowErrorpopped up (reported as #5442 and fixed in 7.11.0). Now I'm seeing a thirdStackOverflowError.Exception Stacktrace:
Code Sample demonstrating the issue:
I have spent some time trying to extract a minimal reproduce for this but no success yet. The
ApiRestController.javathat PMD fails on looks like this: ApiRestController.java. However, when running withPMD_JAVA_OPTS="-Dpmd.error_recovery"it fails on another file (AbstractAdminRestController) instead, that looks like this: AbstractAdminRestController.java.Anything else that I could try/do/provide that would help pinning it down?
Ruleset:
Steps to reproduce:
Please provide detailed steps for how we can reproduce the bug.
Running PMD through: CLI and Gradle 8.14