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:
@ -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)`
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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>
|
||||
|
Reference in New Issue
Block a user