Merge pull request #4906 from Monits:fix-2056

[java] CloseResource should treat parameters as external even if casted when assigned to a local variable #4906
This commit is contained in:
Andreas Dangel
2024-04-04 17:38:51 +02:00
3 changed files with 28 additions and 2 deletions

View File

@ -35,6 +35,8 @@ This is a {{ site.pmd.release_type }} release.
* java-design
* [#3694](https://github.com/pmd/pmd/issues/3694): \[java] SingularField ignores static variables
* [#4873](https://github.com/pmd/pmd/issues/4873): \[java] AvoidCatchingGenericException: Can no longer suppress on the exception itself
* java-errorprone
* [#2056](https://github.com/pmd/pmd/issues/2056): \[java] CloseResource false-positive with URLClassLoader in cast expression
* java-performance
* [#3845](https://github.com/pmd/pmd/issues/3845): \[java] InsufficientStringBufferDeclaration should consider literal expression
* [#4874](https://github.com/pmd/pmd/issues/4874): \[java] StringInstantiation: False-positive when using `new String(charArray)`

View File

@ -20,6 +20,7 @@ import net.sourceforge.pmd.lang.java.ast.ASTArgumentList;
import net.sourceforge.pmd.lang.java.ast.ASTAssignableExpr.ASTNamedReferenceExpr;
import net.sourceforge.pmd.lang.java.ast.ASTAssignmentExpression;
import net.sourceforge.pmd.lang.java.ast.ASTBlock;
import net.sourceforge.pmd.lang.java.ast.ASTCastExpression;
import net.sourceforge.pmd.lang.java.ast.ASTConstructorCall;
import net.sourceforge.pmd.lang.java.ast.ASTConstructorDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTExecutableDeclaration;
@ -340,8 +341,13 @@ public class CloseResourceRule extends AbstractJavaRule {
if (wrappedVarName != null) {
ASTFormalParameters methodParams = method.getFormalParameters();
for (ASTFormalParameter param : methodParams) {
if ((isResourceTypeOrSubtype(param) || wrappedVarName.getParent() instanceof ASTVariableDeclarator
|| wrappedVarName.getParent() instanceof ASTAssignmentExpression)
// get the parent node where it's used (no casts)
Node parentUse = wrappedVarName.getParent();
if (parentUse instanceof ASTCastExpression) {
parentUse = parentUse.getParent();
}
if ((isResourceTypeOrSubtype(param) || parentUse instanceof ASTVariableDeclarator
|| parentUse instanceof ASTAssignmentExpression)
&& JavaAstUtils.isReferenceToVar(wrappedVarName, param.getVarId().getSymbol())) {
return true;
}

View File

@ -2026,6 +2026,24 @@ public class LocalVariableTypeInference {
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>, is never closed
}
}
]]></code>
</test-code>
<test-code>
<description>Parameters don't need to be closed even if casted #2056</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
import java.net.URLClassLoader;
public class CastedParameter {
public void checkValidity(ClassLoader auxclassPathClassLoader) {
if (auxclassPathClassLoader instanceof URLClassLoader) {
final URLClassLoader urlClassLoader = (URLClassLoader) auxclassPathClassLoader;
// doesn't need to be closed, it's still a paramter…
}
}
}
]]></code>
</test-code>