From 02c49ce88137c18936f9b63cc3923496dabfc0cf Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 13 Nov 2015 19:05:24 +0100 Subject: [PATCH] #1440 NPE in AvoidCallingFinalize --- .../finalizers/AvoidCallingFinalizeRule.java | 29 +++++++++++-------- .../finalizers/xml/AvoidCallingFinalize.xml | 12 ++++++++ src/site/markdown/overview/changelog.md | 2 ++ 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/finalizers/AvoidCallingFinalizeRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/finalizers/AvoidCallingFinalizeRule.java index 56464f3b17..6de59975b7 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/finalizers/AvoidCallingFinalizeRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/finalizers/AvoidCallingFinalizeRule.java @@ -13,6 +13,7 @@ import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix; import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix; import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule; import net.sourceforge.pmd.lang.java.symboltable.MethodScope; +import net.sourceforge.pmd.lang.symboltable.ScopedNode; public class AvoidCallingFinalizeRule extends AbstractJavaRule { @@ -27,14 +28,9 @@ public class AvoidCallingFinalizeRule extends AbstractJavaRule { if (name.getImage() == null || !name.getImage().endsWith("finalize")) { return ctx; } - MethodScope meth = name.getScope().getEnclosingScope(MethodScope.class); - if (meth.getName().equals("finalize")) { + if (!checkForViolation(name)) { return ctx; } - if (checked.contains(meth)) { - return ctx; - } - checked.add(meth); addViolation(ctx, name); return ctx; } @@ -48,15 +44,24 @@ public class AvoidCallingFinalizeRule extends AbstractJavaRule { if (firstSuffix == null || firstSuffix.getImage() == null || !firstSuffix.getImage().endsWith("finalize")) { return super.visit(pp, ctx); } - MethodScope meth = pp.getScope().getEnclosingScope(MethodScope.class); - if (meth.getName().equals("finalize")) { + if (!checkForViolation(pp)) { return super.visit(pp, ctx); } - if (checked.contains(meth)) { - return super.visit(pp, ctx); - } - checked.add(meth); addViolation(ctx, pp); return super.visit(pp, ctx); } + + private boolean checkForViolation(ScopedNode node) { + MethodScope meth = node.getScope().getEnclosingScope(MethodScope.class); + if (meth != null && "finalize".equals(meth.getName())) { + return false; + } + if (meth != null && checked.contains(meth)) { + return false; + } + if (meth != null) { + checked.add(meth); + } + return true; + } } diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/finalizers/xml/AvoidCallingFinalize.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/finalizers/xml/AvoidCallingFinalize.xml index a452039d14..d19eaaa737 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/finalizers/xml/AvoidCallingFinalize.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/finalizers/xml/AvoidCallingFinalize.xml @@ -82,4 +82,16 @@ public class Foo { } ]]> + + + #1440 NPE in AvoidCallingFinalize + 1 + + diff --git a/src/site/markdown/overview/changelog.md b/src/site/markdown/overview/changelog.md index 5758cc4618..c60dbced25 100644 --- a/src/site/markdown/overview/changelog.md +++ b/src/site/markdown/overview/changelog.md @@ -19,6 +19,8 @@ **Bugfixes:** +* java-finalizers/AvoidCallingFinalize + * [#1440](https://sourceforge.net/p/pmd/bugs/1440/): NPE in AvoidCallingFinalize * java-unusedcode/UnusedPrivateField * [#1428](https://sourceforge.net/p/pmd/bugs/1428/): False positive in UnusedPrivateField when local variable hides member variable * General