diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 3dbbcfb482..68874d3aa0 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -26,6 +26,7 @@ This is a {{ site.pmd.release_type }} release. * [#1474](https://github.com/pmd/pmd/issues/1474): \[java] ArrayIsStoredDirectly false positive with method call * [#3879](https://github.com/pmd/pmd/issues/3879) \[java] ArrayIsStoredDirectly reports duplicated violation * [#3889](https://github.com/pmd/pmd/pull/3889): \[java] Catch LinkageError in UselessOverridingMethodRule + * [#3929](https://github.com/pmd/pmd/issues/3929): \[java] ArrayIsStoredDirectly should report the assignment rather than formal parameter * plsql * [#3706](https://github.com/pmd/pmd/issues/3706): \[plsql] Parsing exception CURSOR statement with parenthesis groupings diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/ArrayIsStoredDirectlyRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/ArrayIsStoredDirectlyRule.java index 4eeccde81d..d2525fc995 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/ArrayIsStoredDirectlyRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/ArrayIsStoredDirectlyRule.java @@ -7,6 +7,7 @@ package net.sourceforge.pmd.lang.java.rule.bestpractices; import java.util.ArrayList; import java.util.List; +import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTAssignmentOperator; import net.sourceforge.pmd.lang.java.ast.ASTBlockStatement; @@ -120,10 +121,10 @@ public class ArrayIsStoredDirectlyRule extends AbstractSunSecureRule { * Checks if the variable designed in parameter is written to a field (not * local variable) in the statements. */ - private boolean checkForDirectAssignment(Object ctx, final ASTFormalParameter parameter, + private void checkForDirectAssignment(Object ctx, final ASTFormalParameter parameter, final List bs) { final ASTVariableDeclaratorId vid = parameter.getFirstDescendantOfType(ASTVariableDeclaratorId.class); - final String varName = vid.getImage(); + final String varName = vid.getName(); for (ASTBlockStatement b : bs) { if (b.getChild(0) instanceof ASTStatement && b.getChild(0).getChild(0) instanceof ASTStatementExpression) { final ASTStatementExpression se = b.getFirstDescendantOfType(ASTStatementExpression.class); @@ -173,13 +174,13 @@ public class ArrayIsStoredDirectlyRule extends AbstractSunSecureRule { md = pe.getFirstParentOfType(ASTConstructorDeclaration.class); } if (!isLocalVariable(varName, md)) { - addViolation(ctx, parameter, varName); + RuleContext ruleContext = (RuleContext) ctx; + ruleContext.addViolation(e, varName); } } } } } - return false; } private ASTFormalParameter[] getArrays(ASTFormalParameters params) { @@ -187,7 +188,7 @@ public class ArrayIsStoredDirectlyRule extends AbstractSunSecureRule { if (l != null && !l.isEmpty()) { List l2 = new ArrayList<>(); for (ASTFormalParameter fp : l) { - if (fp.isArray() || fp.isVarargs()) { + if (fp.getVariableDeclaratorId().hasArrayType() || fp.isVarargs()) { l2.add(fp); } } diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/ArrayIsStoredDirectly.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/ArrayIsStoredDirectly.xml index 3c58220e61..6b4ffce11c 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/ArrayIsStoredDirectly.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/ArrayIsStoredDirectly.xml @@ -7,6 +7,7 @@ Clear violation 1 + 3 Clear violation with this. 1 + 3 assignment to an internal array 1 + 3 Constructor clear violation 1 + 3 Trigger on Varargs 1 + 3 do not allow private methods false 2 - 3,6 + 4,7 [java] ArrayIsStoredDirectly reports duplicated violation #3879 1 - 5 + 7