-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
[java] UnnecessaryCast: ContextedRuntimeException when parsing switch expression with lambdas #6237
Copy link
Copy link
Closed
Labels
a:bugPMD crashes or fails to analyse a file.PMD crashes or fails to analyse a file.
Milestone
Description
Affects PMD Version: 7.18.0
Rule: UnnecessaryCast
Description:
When launching pmd, it crashes with a ContextedRuntimeException, caused by a ClassCastException, when applying the rule UnnecessaryCast. By reading through the error message, it seems to me that the problem is that I am using a switch expression where the function expects a lambda.
Exception Stacktrace:
...
Exception applying rule UnnecessaryCast on file /home/fbarbari/prova/emu/core/src/main/java/com/ledmington/emu/X86Cpu.java, continuing with next rule
org.apache.commons.lang3.exception.ContextedRuntimeException: java.lang.ClassCastException: class net.sourceforge.pmd.lang.java.ast.ASTSwitchExpression cannot be cast to class net.sourceforge.pmd.lang.java.ast.InvocationNode (net.sourceforge.pmd.lang.java.ast.ASTSwitchExpression and net.sourceforge.pmd.lang.java.ast.InvocationNode are in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader @5fe469d4)
Exception Context:
[1:Rule applied on node=!debug only! [CastExpression:574:23](long) imm.asInt()]
---------------------------------
at net.sourceforge.pmd.util.AssertionUtil.contexted(AssertionUtil.java:257)
at net.sourceforge.pmd.lang.rule.internal.RuleApplicator.applyOnIndex(RuleApplicator.java:79)
at net.sourceforge.pmd.lang.rule.internal.RuleApplicator.apply(RuleApplicator.java:57)
at net.sourceforge.pmd.lang.rule.internal.RuleSets.apply(RuleSets.java:183)
at net.sourceforge.pmd.lang.impl.PmdRunnable.processSource(PmdRunnable.java:140)
at net.sourceforge.pmd.lang.impl.PmdRunnable.run(PmdRunnable.java:80)
at java.base@21.0.8/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
at java.base@21.0.8/java.util.concurrent.FutureTask.run(FutureTask.java:317)
at java.base@21.0.8/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base@21.0.8/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base@21.0.8/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.ClassCastException: class net.sourceforge.pmd.lang.java.ast.ASTSwitchExpression cannot be cast to class net.sourceforge.pmd.lang.java.ast.InvocationNode (net.sourceforge.pmd.lang.java.ast.ASTSwitchExpression and net.sourceforge.pmd.lang.java.ast.InvocationNode are in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader @5fe469d4)
at net.sourceforge.pmd.lang.java.rule.codestyle.UnnecessaryCastRule.isCastDeterminingReturnOfLambda(UnnecessaryCastRule.java:281)
at net.sourceforge.pmd.lang.java.rule.codestyle.UnnecessaryCastRule.isCastUnnecessary(UnnecessaryCastRule.java:143)
at net.sourceforge.pmd.lang.java.rule.codestyle.UnnecessaryCastRule.visit(UnnecessaryCastRule.java:111)
at net.sourceforge.pmd.lang.java.ast.ASTCastExpression.acceptVisitor(ASTCastExpression.java:33)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.apply(AbstractJavaRule.java:30)
at net.sourceforge.pmd.lang.rule.RuleReference.apply(RuleReference.java:413)
at net.sourceforge.pmd.lang.rule.internal.RuleApplicator.applyOnIndex(RuleApplicator.java:77)
... 9 more
Exception occurred on node !debug only! [CastExpression:574:23](long) imm.asInt()
Exception applying rule UnnecessaryCast on file /home/fbarbari/prova/emu/core/src/main/java/com/ledmington/emu/X86Cpu.java, continuing with next rule
org.apache.commons.lang3.exception.ContextedRuntimeException: java.lang.ClassCastException: class net.sourceforge.pmd.lang.java.ast.ASTSwitchExpression cannot be cast to class net.sourceforge.pmd.lang.java.ast.InvocationNode (net.sourceforge.pmd.lang.java.ast.ASTSwitchExpression and net.sourceforge.pmd.lang.java.ast.InvocationNode are in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader @5fe469d4)
Exception Context:
[1:Rule applied on node=!debug only! [CastExpression:573:22](long) imm.asByte()]
---------------------------------
at net.sourceforge.pmd.util.AssertionUtil.contexted(AssertionUtil.java:257)
at net.sourceforge.pmd.lang.rule.internal.RuleApplicator.applyOnIndex(RuleApplicator.java:79)
at net.sourceforge.pmd.lang.rule.internal.RuleApplicator.apply(RuleApplicator.java:57)
at net.sourceforge.pmd.lang.rule.internal.RuleSets.apply(RuleSets.java:183)
at net.sourceforge.pmd.lang.impl.PmdRunnable.processSource(PmdRunnable.java:140)
at net.sourceforge.pmd.lang.impl.PmdRunnable.run(PmdRunnable.java:80)
at java.base@21.0.8/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
at java.base@21.0.8/java.util.concurrent.FutureTask.run(FutureTask.java:317)
at java.base@21.0.8/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base@21.0.8/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base@21.0.8/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.ClassCastException: class net.sourceforge.pmd.lang.java.ast.ASTSwitchExpression cannot be cast to class net.sourceforge.pmd.lang.java.ast.InvocationNode (net.sourceforge.pmd.lang.java.ast.ASTSwitchExpression and net.sourceforge.pmd.lang.java.ast.InvocationNode are in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader @5fe469d4)
at net.sourceforge.pmd.lang.java.rule.codestyle.UnnecessaryCastRule.isCastDeterminingReturnOfLambda(UnnecessaryCastRule.java:281)
at net.sourceforge.pmd.lang.java.rule.codestyle.UnnecessaryCastRule.isCastUnnecessary(UnnecessaryCastRule.java:143)
at net.sourceforge.pmd.lang.java.rule.codestyle.UnnecessaryCastRule.visit(UnnecessaryCastRule.java:111)
at net.sourceforge.pmd.lang.java.ast.ASTCastExpression.acceptVisitor(ASTCastExpression.java:33)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.apply(AbstractJavaRule.java:30)
at net.sourceforge.pmd.lang.rule.RuleReference.apply(RuleReference.java:413)
at net.sourceforge.pmd.lang.rule.internal.RuleApplicator.applyOnIndex(RuleApplicator.java:77)
... 9 more
Exception occurred on node !debug only! [CastExpression:573:22](long) imm.asByte()
> Task :core:pmdMain FAILED
/home/fbarbari/prova/emu/core/src/main/java/com/ledmington/emu/X86Cpu.java - ContextedRuntimeException: java.lang.ClassCastException: class net.sourceforge.pmd.lang.java.ast.ASTSwitchExpression cannot be cast to class net.sourceforge.pmd.lang.java.ast.InvocationNode (net.sourceforge.pmd.lang.java.ast.ASTSwitchExpression and net.sourceforge.pmd.lang.java.ast.InvocationNode are in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader @5fe469d4)
Exception Context:
[1:Rule applied on node=!debug only! [CastExpression:574:23](long) imm.asInt()]
---------------------------------
/home/fbarbari/prova/emu/core/src/main/java/com/ledmington/emu/X86Cpu.java - ContextedRuntimeException: java.lang.ClassCastException: class net.sourceforge.pmd.lang.java.ast.ASTSwitchExpression cannot be cast to class net.sourceforge.pmd.lang.java.ast.InvocationNode (net.sourceforge.pmd.lang.java.ast.ASTSwitchExpression and net.sourceforge.pmd.lang.java.ast.InvocationNode are in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader @5fe469d4)
Exception Context:
[1:Rule applied on node=!debug only! [CastExpression:573:22](long) imm.asByte()]
---------------------------------
Code Sample demonstrating the issue:
This is the problematic part, in particular the switch returning lambdas (at core/src/main/java/com/ledmington/emu/X86Cpu.java, line 568).
private void opSX(final Register64 op1, final Immediate imm, final BiFunction<Long, Long, Long> task) {
op(
() -> rf.get(op1),
// FIXME: ugly
switch (imm.bits()) {
case 8 -> () -> (long) imm.asByte();
case 32 -> () -> (long) imm.asInt();
default -> throw new IllegalArgumentException(String.format("Unknown immediate: %s.", imm));
},
task,
result -> rf.set(op1, result),
true);
}Steps to reproduce:
Please provide detailed steps for how we can reproduce the bug.
git clone https://github.com/Ledmington/emu.gitcd emugit checkout 9ec3ef3f4982f7e779e0e8ea1812fb034a4919e1./gradlew clean :core:pmdMain
Running PMD through: Gradle
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
a:bugPMD crashes or fails to analyse a file.PMD crashes or fails to analyse a file.