diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codesize/StdCyclomaticComplexityRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codesize/StdCyclomaticComplexityRule.java index 687f78699b..a269dab874 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codesize/StdCyclomaticComplexityRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codesize/StdCyclomaticComplexityRule.java @@ -166,8 +166,8 @@ public Object visit(ASTClassOrInterfaceDeclaration node, Object data) { entryStack.push( new Entry( node ) ); super.visit( node, data ); + Entry classEntry = entryStack.pop(); if ( showClassesComplexity ) { - Entry classEntry = entryStack.pop(); if ( classEntry.getComplexityAverage() >= reportLevel || classEntry.highestDecisionPoints >= reportLevel ) { addViolation( data, node, new String[] { diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/codesize/StdCyclomaticComplexityRuleTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/codesize/StdCyclomaticComplexityRuleTest.java new file mode 100644 index 0000000000..88181451cb --- /dev/null +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/codesize/StdCyclomaticComplexityRuleTest.java @@ -0,0 +1,42 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ +package net.sourceforge.pmd.lang.java.rule.codesize; + +import java.io.StringReader; +import java.util.Arrays; + +import org.junit.Assert; +import org.junit.Test; + +import net.sourceforge.pmd.RuleContext; +import net.sourceforge.pmd.lang.LanguageRegistry; +import net.sourceforge.pmd.lang.LanguageVersion; +import net.sourceforge.pmd.lang.Parser; +import net.sourceforge.pmd.lang.ParserOptions; +import net.sourceforge.pmd.lang.ast.Node; +import net.sourceforge.pmd.lang.java.JavaLanguageModule; + +public class StdCyclomaticComplexityRuleTest { + + /** + * Make sure the entry stack is empty, if show classes complexity is disabled. + * + * @see bug #1501 + */ + @Test + public void entryStackMustBeEmpty() { + StdCyclomaticComplexityRule rule = new StdCyclomaticComplexityRule(); + rule.setProperty(StdCyclomaticComplexityRule.SHOW_CLASSES_COMPLEXITY_DESCRIPTOR, Boolean.FALSE); + + RuleContext ctx = new RuleContext(); + LanguageVersion javaLanguageVersion = LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.8"); + ParserOptions parserOptions = javaLanguageVersion.getLanguageVersionHandler().getDefaultParserOptions(); + Parser parser = javaLanguageVersion.getLanguageVersionHandler().getParser(parserOptions); + Node node = parser.parse("test", new StringReader("public class SampleClass {}")); + + rule.apply(Arrays.asList(node), ctx); + + Assert.assertTrue(rule.entryStack.isEmpty()); + } +} diff --git a/src/site/markdown/overview/changelog.md b/src/site/markdown/overview/changelog.md index 88f5da3a39..562fb62747 100644 --- a/src/site/markdown/overview/changelog.md +++ b/src/site/markdown/overview/changelog.md @@ -12,9 +12,12 @@ * [#101](https://github.com/pmd/pmd/pull/101): \[java] Improve multithreading performance: do not lock on classloader * [#102](https://github.com/pmd/pmd/pull/102): \[apex] Restrict AvoidLogicInTrigger rule to max. 1 violation per file +* [#103](https://github.com/pmd/pmd/pull/103): \[java] \[apex] Fix for 1501: CyclomaticComplexity rule causes OOM when class reporting is disabled **Bugfixes:** +* Java + * [#1501](https://sourceforge.net/p/pmd/bugs/1501/): \[java] \[apex] CyclomaticComplexity rule causes OOM when class reporting is disabled * General * [#1499](https://sourceforge.net/p/pmd/bugs/1499/): \[core] CPD test break PMD 5.5.1 build on Windows