diff options
author | Cedric Vivier <cedricv@neonux.com> | 2009-06-10 18:39:57 +0400 |
---|---|---|
committer | Cedric Vivier <cedricv@neonux.com> | 2009-06-10 18:39:57 +0400 |
commit | deb679ea86e2b2665a75be9dc1666ee39b9318e0 (patch) | |
tree | f9d83b4225d37b9913852b64fef57828d54ec9e4 | |
parent | 1b513aa3f540ecd227cdffb80575d9ac204b9600 (diff) |
2009-06-10 Cedric Vivier <cedricv@neonux.com>
* BadRecursiveInvocationRule.cs: Catch recursion on static properties/methods
when the call is the first instruction (excluding arguments if any).
svn path=/trunk/mono-tools/; revision=135856
3 files changed, 35 insertions, 5 deletions
diff --git a/gendarme/rules/Gendarme.Rules.Correctness/BadRecursiveInvocationRule.cs b/gendarme/rules/Gendarme.Rules.Correctness/BadRecursiveInvocationRule.cs index d1d52c6c..411eb77a 100644 --- a/gendarme/rules/Gendarme.Rules.Correctness/BadRecursiveInvocationRule.cs +++ b/gendarme/rules/Gendarme.Rules.Correctness/BadRecursiveInvocationRule.cs @@ -132,11 +132,10 @@ namespace Gendarme.Rules.Correctness { private static bool CheckForEndlessRecursion (MethodDefinition method, int index) { int pcount = method.Parameters.Count; - if (index <= pcount) - return false; - if (!method.HasThis) pcount--; + if (index <= pcount) + return false; for (int i = pcount; i >= 0; i--) { if (!CheckParams (method, ref index, i)) diff --git a/gendarme/rules/Gendarme.Rules.Correctness/ChangeLog b/gendarme/rules/Gendarme.Rules.Correctness/ChangeLog index c747a006..49d95171 100644 --- a/gendarme/rules/Gendarme.Rules.Correctness/ChangeLog +++ b/gendarme/rules/Gendarme.Rules.Correctness/ChangeLog @@ -1,3 +1,8 @@ +2009-06-10 Cedric Vivier <cedricv@neonux.com> + + * BadRecursiveInvocationRule.cs: Catch recursion on static properties/methods + when the call is the first instruction (excluding arguments if any). + 2008-04-30 Jesse Jones <jesjones@mindspring.com> * AvoidMethodsWithSideEffectsInConditionalCodeRule.cs: diff --git a/gendarme/rules/Gendarme.Rules.Correctness/Test/BadRecursiveInvocationTest.cs b/gendarme/rules/Gendarme.Rules.Correctness/Test/BadRecursiveInvocationTest.cs index 082d6961..74cd0c43 100644 --- a/gendarme/rules/Gendarme.Rules.Correctness/Test/BadRecursiveInvocationTest.cs +++ b/gendarme/rules/Gendarme.Rules.Correctness/Test/BadRecursiveInvocationTest.cs @@ -72,6 +72,10 @@ namespace Test.Rules.Correctness { get { return FooPlusOne + 1; } } + public static int StaticFooPlusOne { + get { return StaticFooPlusOne + 1; } + } + /* correct */ public int Bar { get { return -1; } @@ -98,6 +102,21 @@ namespace Test.Rules.Correctness { return Equals (obzekt); } + public static int StaticGoodOverload (object obzekt) + { + return StaticGoodOverload ((string) obzekt); + } + + public static int StaticGoodOverload (string s) + { + return 0; + } + + public static int StaticBad (object obzekt) + { + return StaticBad (obzekt); + } + public static int StaticBadFibo (int n) { return StaticBadFibo (n - 1) + StaticBadFibo (n - 2); @@ -160,6 +179,7 @@ namespace Test.Rules.Correctness { AssertRuleFailure<BadRec> ("get_Foo", 1); AssertRuleFailure<BadRec> ("get_OnePlusFoo", 1); AssertRuleFailure<BadRec> ("get_FooPlusOne", 1); + AssertRuleFailure<BadRec> ("get_StaticFooPlusOne", 1); } [Test] @@ -181,9 +201,10 @@ namespace Test.Rules.Correctness { } [Test] - public void BadRecursiveMethod () + public void BadRecursiveMethods () { AssertRuleFailure<BadRec> ("Equals", 1); + AssertRuleFailure<BadRec> ("StaticBad", 1); } [Test] @@ -335,7 +356,6 @@ namespace Test.Rules.Correctness { } [Test] - [Ignore ("needs review, this work on MS compiled code!")] public void MoreCoverage_Static () { AssertRuleFailure<Coverage> ("StaticFewParameters", 1); @@ -348,5 +368,11 @@ namespace Test.Rules.Correctness { AssertRuleFailure<Coverage> ("FewParameters", 1); AssertRuleFailure<Coverage> ("ManyParameters", 1); } + + [Test] + public void StaticGoodOverload () + { + AssertRuleSuccess<BadRec> ("StaticGoodOverload", new Type [] { typeof (object) }); + } } } |