A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/pmd/pmd/issues/5261 below:

[java] Record patterns with empty deconstructor lists lead to NPE · Issue #5261 · pmd/pmd · GitHub

Affects PMD Version:

PMD 7.6.0 (d8d4d3d061bdc292cb23f364057ffba2fd414605, 2024-09-27T08:50:09Z)
Java version: 22.0.2, vendor: GraalVM Community, runtime: /usr/lib/jvm/java-22-graalvm

Description:

PMD 7.6.0 fails to parse something like if (a instanceof RecordA()) {...} or switch (a) { case B() -> {...} }. (I have tested with 7.5.0 and it fails with the same NPE. I didn't test against older versions.)

Exception Stacktrace:

java.lang.NullPointerException: Cannot invoke "net.sourceforge.pmd.lang.java.ast.ASTPatternList.toStream()" because the return value of "net.sourceforge.pmd.lang.java.ast.ASTRecordPattern.getComponentPatterns()" is null
	at net.sourceforge.pmd.lang.java.symbols.table.internal.PatternBindingsUtil.bindersOfPattern(PatternBindingsUtil.java:99)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.PatternBindingsUtil.bindersOfExpr(PatternBindingsUtil.java:62)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor$StatementVisitor.visit(SymbolTableResolver.java:607)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor$StatementVisitor.visit(SymbolTableResolver.java:583)
	at net.sourceforge.pmd.lang.java.ast.ASTIfStatement.acceptVisitor(ASTIfStatement.java:70)
	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:59)
	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:38)
	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:109)
	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:1570)

Code Sample demonstrating the issue:

public class Test {
    private void testIf() {
        Foo foo = new Foo.Bar();
        if (foo instanceof Foo.Bar()) {} // <---- 
    }

    private void testCase() {
        Foo foo = new Foo.Bar();
        switch (foo) {
            case Foo.Bar() -> {} // <----
        }
    }

    sealed interface Foo {
        record Bar() implements Foo {}
    }
}

Steps to reproduce:

Please provide detailed steps for how we can reproduce the bug.

  1. Download pmd-dist-7.6.0-bin.zip from GitHub release and unzip.
  2. Copy the above code sample into test/Test.java.
  3. Verify the Test.java compiles with javac (mine: javac 22.0.2).
  4. Run PMD: bin/pmd check -R some.xml -d test --use-version=java-23.
  5. PMD outputs:
    test/Test.java	-	NullPointerException: Cannot invoke "net.sourceforge.pmd.lang.java.ast.ASTPatternList.toStream()" because the return value of "net.sourceforge.pmd.lang.java.ast.ASTRecordPattern.getComponentPatterns()" is null`
    

Running PMD through: CLI

JDK/OS

OS: Arch Linux
JDK: java-22-graalvm

$ java -version
openjdk version "22.0.2" 2024-07-16
OpenJDK Runtime Environment GraalVM CE 22.0.2+9.1 (build 22.0.2+9-jvmci-b01)
OpenJDK 64-Bit Server VM GraalVM CE 22.0.2+9.1 (build 22.0.2+9-jvmci-b01, mixed mode, sharing)

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4