From 2d9fc5f15447776ab3910a4ccce01dde9a2987c1 Mon Sep 17 00:00:00 2001 From: Volodymyr Usarskyy Date: Wed, 7 Mar 2012 12:42:26 +0100 Subject: [PATCH] PreferTryParseRule.cs : fixed null-reference exception that happens when Resolve() method cannot find a library with base type and returns null PreferUriOverStringRule.cs : fixed index-out-of-range exception that happens for three-letter method names (test is included) AvoidDeepInheritanceTreeRule.cs : fixed null-reference exception that happens when Resolve() method cannot find a library with base type and returns null --- .../Gendarme.Rules.BadPractice/PreferTryParseRule.cs | 4 +++- .../Gendarme.Rules.Design/PreferUriOverStringRule.cs | 7 ++++--- .../Test/PreferUriOverStringTest.cs | 6 ++++++ .../AvoidDeepInheritanceTreeRule.cs | 10 ++++++---- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/gendarme/rules/Gendarme.Rules.BadPractice/PreferTryParseRule.cs b/gendarme/rules/Gendarme.Rules.BadPractice/PreferTryParseRule.cs index 432c9baee..7856cdbd0 100644 --- a/gendarme/rules/Gendarme.Rules.BadPractice/PreferTryParseRule.cs +++ b/gendarme/rules/Gendarme.Rules.BadPractice/PreferTryParseRule.cs @@ -118,6 +118,7 @@ public class PreferTryParseRule : Rule, IMethodRule { static bool HasTryParseMethod (TypeDefinition type) { bool present = false; + if (!has_try_parse.TryGetValue (type, out present)) { foreach (MethodReference method in type.Methods) { if (MethodSignatures.TryParse.Matches (method)) { @@ -162,7 +163,8 @@ public RuleResult CheckMethod (MethodDefinition method) if (!MethodSignatures.Parse.Matches (mr)) continue; - if (!HasTryParseMethod (mr.DeclaringType.Resolve ())) + TypeDefinition declaringType = mr.DeclaringType.Resolve(); + if (declaringType != null && !HasTryParseMethod(declaringType)) continue; // if inside a try (catch/finally) block then... diff --git a/gendarme/rules/Gendarme.Rules.Design/PreferUriOverStringRule.cs b/gendarme/rules/Gendarme.Rules.Design/PreferUriOverStringRule.cs index e3160326e..d85c7f8cc 100644 --- a/gendarme/rules/Gendarme.Rules.Design/PreferUriOverStringRule.cs +++ b/gendarme/rules/Gendarme.Rules.Design/PreferUriOverStringRule.cs @@ -111,10 +111,11 @@ private static int FindTokenStart (string memberName, string token, int start) private static bool IsUri (string memberName) { int index = 0; - while ((index = FindTokenStart (memberName, "ur", index)) != -1) { - if (memberName.Length < index + 2) + while ((index = FindTokenStart(memberName, "ur", index)) != -1) + { + if (memberName.Length <= index + 2) break; - if (url_enders.Contains (Char.ToLower (memberName [index + 2], CultureInfo.InvariantCulture))) + if (url_enders.Contains(Char.ToLower(memberName[index + 2], CultureInfo.InvariantCulture))) return true; index += 2; } diff --git a/gendarme/rules/Gendarme.Rules.Design/Test/PreferUriOverStringTest.cs b/gendarme/rules/Gendarme.Rules.Design/Test/PreferUriOverStringTest.cs index ed460fd83..ff975fdd5 100644 --- a/gendarme/rules/Gendarme.Rules.Design/Test/PreferUriOverStringTest.cs +++ b/gendarme/rules/Gendarme.Rules.Design/Test/PreferUriOverStringTest.cs @@ -52,6 +52,11 @@ public string Urn get; set; } + public string CUR + { + get; + set; + } public Uri GetUri () { @@ -117,6 +122,7 @@ public void Good () { AssertRuleSuccess (SimpleMethods.EmptyMethod); AssertRuleSuccess ("GetUri"); + AssertRuleSuccess("get_CUR"); AssertRuleSuccess ("GetNewLink"); AssertRuleSuccess ("OverloadedMethod", new Type [] { typeof (string) }); } diff --git a/gendarme/rules/Gendarme.Rules.Maintainability/AvoidDeepInheritanceTreeRule.cs b/gendarme/rules/Gendarme.Rules.Maintainability/AvoidDeepInheritanceTreeRule.cs index 942d919cb..6676a3855 100644 --- a/gendarme/rules/Gendarme.Rules.Maintainability/AvoidDeepInheritanceTreeRule.cs +++ b/gendarme/rules/Gendarme.Rules.Maintainability/AvoidDeepInheritanceTreeRule.cs @@ -85,11 +85,13 @@ public RuleResult CheckType (TypeDefinition type) return RuleResult.DoesNotApply; int depth = 0; - while (type.BaseType != null) { - type = type.BaseType.Resolve (); - if (type == null) + TypeDefinition temp = type; + while (temp.BaseType != null) + { + temp = temp.BaseType.Resolve(); + if (temp == null) break; - if (countExternalDepth || Runner.Assemblies.Contains (type.Module.Assembly)) + if (countExternalDepth || Runner.Assemblies.Contains(temp.Module.Assembly)) depth++; }