pmd: fix #1063 False+: ArrayIsStoredDirectly
This commit is contained in:
@ -1,6 +1,7 @@
|
|||||||
????? ??, 2013 - 5.0.4:
|
????? ??, 2013 - 5.0.4:
|
||||||
|
|
||||||
Fixed bug 254: False+ : UnusedImport with Javadoc @throws
|
Fixed bug 254: False+ : UnusedImport with Javadoc @throws
|
||||||
|
Fixed bug 1063: False+: ArrayIsStoredDirectly
|
||||||
Fixed bug 1080: net.sourceforge.pmd.cpd.CPDTest test failing
|
Fixed bug 1080: net.sourceforge.pmd.cpd.CPDTest test failing
|
||||||
Fixed bug 1081: Regression: CPD skipping all files when using relative paths
|
Fixed bug 1081: Regression: CPD skipping all files when using relative paths
|
||||||
Fixed bug 1082: CPD performance issue on larger projects
|
Fixed bug 1082: CPD performance issue on larger projects
|
||||||
|
@ -19,6 +19,7 @@ import net.sourceforge.pmd.lang.java.ast.ASTFormalParameter;
|
|||||||
import net.sourceforge.pmd.lang.java.ast.ASTFormalParameters;
|
import net.sourceforge.pmd.lang.java.ast.ASTFormalParameters;
|
||||||
import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
|
import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
|
||||||
import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression;
|
import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression;
|
||||||
|
import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix;
|
||||||
import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix;
|
import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix;
|
||||||
import net.sourceforge.pmd.lang.java.ast.ASTStatementExpression;
|
import net.sourceforge.pmd.lang.java.ast.ASTStatementExpression;
|
||||||
import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId;
|
import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId;
|
||||||
@ -63,6 +64,25 @@ public class ArrayIsStoredDirectlyRule extends AbstractSunSecureRule {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getExpressionVarName(Node e) {
|
||||||
|
String assignedVar = getFirstNameImage(e);
|
||||||
|
if (assignedVar == null) {
|
||||||
|
ASTPrimarySuffix suffix = e.getFirstDescendantOfType(ASTPrimarySuffix.class);
|
||||||
|
if (suffix != null) {
|
||||||
|
assignedVar = suffix.getImage();
|
||||||
|
ASTPrimaryPrefix prefix = e.getFirstDescendantOfType(ASTPrimaryPrefix.class);
|
||||||
|
if (prefix != null) {
|
||||||
|
if (prefix.usesThisModifier()) {
|
||||||
|
assignedVar = "this." + assignedVar;
|
||||||
|
} else if (prefix.usesSuperModifier()) {
|
||||||
|
assignedVar = "super." + assignedVar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return assignedVar;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the variable designed in parameter is written to a field (not local variable) in the statements.
|
* Checks if the variable designed in parameter is written to a field (not local variable) in the statements.
|
||||||
*/
|
*/
|
||||||
@ -76,13 +96,9 @@ public class ArrayIsStoredDirectlyRule extends AbstractSunSecureRule {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ASTPrimaryExpression pe = (ASTPrimaryExpression) se.jjtGetChild(0);
|
ASTPrimaryExpression pe = (ASTPrimaryExpression) se.jjtGetChild(0);
|
||||||
String assignedVar = getFirstNameImage(pe);
|
String assignedVar = getExpressionVarName(pe);
|
||||||
if (assignedVar == null) {
|
if (assignedVar == null) {
|
||||||
ASTPrimarySuffix suffix = se.getFirstDescendantOfType(ASTPrimarySuffix.class);
|
continue;
|
||||||
if (suffix == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
assignedVar = suffix.getImage();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Node n = pe.getFirstParentOfType(ASTMethodDeclaration.class);
|
Node n = pe.getFirstParentOfType(ASTMethodDeclaration.class);
|
||||||
@ -103,14 +119,7 @@ public class ArrayIsStoredDirectlyRule extends AbstractSunSecureRule {
|
|||||||
if (e.hasDescendantOfType(ASTEqualityExpression.class)) {
|
if (e.hasDescendantOfType(ASTEqualityExpression.class)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
String val = getFirstNameImage(e);
|
String val = getExpressionVarName(e);
|
||||||
if (val == null) {
|
|
||||||
ASTPrimarySuffix foo = se.getFirstDescendantOfType(ASTPrimarySuffix.class);
|
|
||||||
if (foo == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
val = foo.getImage();
|
|
||||||
}
|
|
||||||
if (val == null) {
|
if (val == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -133,4 +133,24 @@ public class Foo {
|
|||||||
}
|
}
|
||||||
]]></code>
|
]]></code>
|
||||||
</test-code>
|
</test-code>
|
||||||
|
|
||||||
|
<test-code>
|
||||||
|
<description>#1063 False+: ArrayIsStoredDirectly</description>
|
||||||
|
<expected-problems>0</expected-problems>
|
||||||
|
<code><![CDATA[
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
public class TestClass {
|
||||||
|
private final Object[] obj;
|
||||||
|
|
||||||
|
public TestClass(Object[] obj) {
|
||||||
|
if (obj == null) {
|
||||||
|
this.obj = new Object[]{};
|
||||||
|
} else {
|
||||||
|
this.obj = Arrays.copyOf(obj, obj.length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]]></code>
|
||||||
|
</test-code>
|
||||||
</test-data>
|
</test-data>
|
||||||
|
Reference in New Issue
Block a user