A RetroSearch Logo

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

Search Query:

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

[java] NPE in MoreThanOneLoggerRule on a java 16 record · Issue #3304 · pmd/pmd · GitHub

Rule: MoreThanOneLogger

Affects PMD Version:

6.34.0

Description:

We started adding java 16 records and PMD is generating a stacktrace when analyzing a source file containing a record

Exception applying rule MoreThanOneLogger on file [...]/com/quicksign/Reproducer.java, continuing with next rule

Exception Stacktrace:

java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "this.count" is null 	
 at net.sourceforge.pmd.lang.java.rule.errorprone.MoreThanOneLoggerRule.visit(MoreThanOneLoggerRule.java:64) 	
 at net.sourceforge.pmd.lang.java.ast.ASTVariableDeclarator.jjtAccept(ASTVariableDeclarator.java:42) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:220) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:677) 	
 at net.sourceforge.pmd.lang.java.ast.ASTLocalVariableDeclaration.jjtAccept(ASTLocalVariableDeclaration.java:46) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:220) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:672) 	
 at net.sourceforge.pmd.lang.java.ast.ASTBlockStatement.jjtAccept(ASTBlockStatement.java:25) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:220) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:667) 	
 at net.sourceforge.pmd.lang.java.ast.ASTBlock.jjtAccept(ASTBlock.java:27) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:220) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:447) 	
 at net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration.jjtAccept(ASTMethodDeclaration.java:37) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:220) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:267) 	
 at net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceBodyDeclaration.jjtAccept(ASTClassOrInterfaceBodyDeclaration.java:44) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:220) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:862) 	
 at net.sourceforge.pmd.lang.java.ast.ASTRecordBody.jjtAccept(ASTRecordBody.java:31) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:220) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:847) 	
 at net.sourceforge.pmd.lang.java.ast.ASTRecordDeclaration.jjtAccept(ASTRecordDeclaration.java:40) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:220) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:417) 	
 at net.sourceforge.pmd.lang.java.ast.ASTTypeDeclaration.jjtAccept(ASTTypeDeclaration.java:39) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:220) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit(AbstractJavaRule.java:392) 	
 at net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit.jjtAccept(ASTCompilationUnit.java:44) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visitAll(AbstractJavaRule.java:163) 	
 at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.apply(AbstractJavaRule.java:157) 	
 at net.sourceforge.pmd.lang.rule.AbstractDelegateRule.apply(AbstractDelegateRule.java:336) 	
 at net.sourceforge.pmd.RuleSet.apply(RuleSet.java:659) 	
 at net.sourceforge.pmd.RuleSets.apply(RuleSets.java:163) 	
 at net.sourceforge.pmd.SourceCodeProcessor.processSource(SourceCodeProcessor.java:200) 	
 at net.sourceforge.pmd.SourceCodeProcessor.processSourceCodeWithoutCache(SourceCodeProcessor.java:113) 	
 at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:95) 	
 at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:57) 	
 at net.sourceforge.pmd.processor.PmdRunnable.call(PmdRunnable.java:85) 	
 at net.sourceforge.pmd.processor.MonoThreadProcessor.runAnalysis(MonoThreadProcessor.java:32) 	
 at net.sourceforge.pmd.processor.AbstractPMDProcessor.processFiles(AbstractPMDProcessor.java:139) 	
 at net.sourceforge.pmd.PMD.processFiles(PMD.java:356) 	
 at net.sourceforge.pmd.ant.internal.PMDTaskImpl.doTask(PMDTaskImpl.java:188) 	
 at net.sourceforge.pmd.ant.internal.PMDTaskImpl.execute(PMDTaskImpl.java:279) 	
 at net.sourceforge.pmd.ant.PMDTask.execute(PMDTask.java:50) 	
 at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 	
 at jdk.internal.reflect.GeneratedMethodAccessor6625.invoke(Unknown Source) 	
 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 	
 at java.base/java.lang.reflect.Method.invoke(Method.java:567) 	
 at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:99) 	
 at groovy.util.AntBuilder.performTask(AntBuilder.java:335) 	
 at groovy.util.AntBuilder.nodeCompleted(AntBuilder.java:280)


Code Sample demonstrating the issue:

import java.util.ArrayList;
import java.util.List;

public record Reproducer(List<String> smsIds) {

  public Reproducer createMe(final String smsId) {
    final List<String> newList = new ArrayList<>(smsIds);
    newList.add(smsId);
    return new Reproducer(newList);
  }
}

It appears to be related to the List being modified and passed to create a record.

Steps to reproduce:

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

  1. ./gradlew pmdMain
  2. stacktrace appears in the console and in the html report

Unfortunately, MoreThanOneLoggerRule is a java based rule so I have no clue how to unit test it within PMD (and I didn't find any test cases associated with it).

I am not sure how to proceed with this, looking at the rule source code doesn't help much. Also, it looks like a rule that could be rewritten as an XPath 2.0 rule (with the obvious test cases).

What do you think?


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