代码分析规则CA1062行为

时间:2013-03-03 17:44:15

标签: c# .net visual-studio-2012 code-analysis fxcop

我对字符串有以下扩展方法:

public static bool IsNullOrEmpty(this string target)
{
    return string.IsNullOrEmpty(target);
}

...在代码中我按如下方式使用它:

public static string DoSomethingOnString(this string target)
{
    if (target.IsNullOrEmpty())
        return target;

    target = target.Trim();  //This line causes CA1062 violation

    return target;
}

现在,如果我对此进行代码分析,则会违反规则CA1062。 但是,如果我将代码更改为:

public static string DoSomethingOnString(this string target)
{
    if (string.IsNullOrEmpty(target))  //CHANGED LINE
        return target;

    target = target.Trim();  //This line DOES NOT cause CA1062 violation anymore

    return target;
}

......那很好。

为什么它认为我在第一个例子中没有检查空状态?它只检查string.IsNullOrEmpty或string.IsNullOrWhiteSpace吗?有没有办法让CA识别我的扩展方法,或者我需要压制这个规则?

更新 如果您遇到同样的问题,可以对我在MS Connect上提交的反馈项进行投票: Code Analysis rule CA1062 raises false alarm

2 个答案:

答案 0 :(得分:12)

  

为什么它认为我在第一个例子中没有检查空状态?

很简单,如果您的IsNullOrEmpty扩展方法与string.IsNullOrEmpty完全相同,则FxCop不明白。它没有意识到如果target为空,IsNullOrEmpty将返回true,您的方法将退出。基本上我怀疑它具有string.IsNullOrEmpty的内置知识。 Code Contracts更有可能在这里获得成功,因为我相信FxCop只会对代码所做的事情进行相对浅薄的检查,与代码合约的深层推理相比。您可以使用ValidatedNotNullAttribute修饰IsNullOrEmpty方法,以告知FxCop发生了什么。

public static bool IsNullOrEmpty([ValidatedNotNullAttribute] this string target)
{
    return string.IsNullOrEmpty(target);
}
//The naming is important to inform FxCop
sealed class ValidatedNotNullAttribute : Attribute { }

这只是代码分析有时候太急于批评的一个例子。这是我用过的几乎所有代码分析工具都能看到的东西。您的选择通常是:

  • 更改代码以解决代码分析工具,即使在
  • 之前没问题
  • 在手动检查每个规则后,取消特定网站上的规则
  • 如果他们经常给出误报,则取消整个规则
  • 完全放弃代码分析工具

您还应该记录错误或功能请求,当然......

答案 1 :(得分:0)

看来他们终于在roslyn分析仪中解决了这个问题。

错误报告在这里: https://github.com/dotnet/roslyn-analyzers/issues/2369