11

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

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;
}

……然后就好了。

为什么它认为我没有在第一个示例中检查 null 条件?它是否只检查 string.IsNullOrEmpty 或 string.IsNullOrWhiteSpace?有没有办法让 CA 识别我的扩展方法,或者我需要禁止这条规则?

更新: 如果您有同样的问题,您可以对我在 MS Connect 上提交的反馈项目进行投票: 代码分析规则 CA1062 引发误报

4

2 回答 2

18

为什么它认为我没有在第一个示例中检查 null 条件?

很简单,如果您的IsNullOrEmpty扩展方法与string.IsNullOrEmpty. 它没有意识到如果target为空,IsNullOrEmpty将返回true并且您的方法将退出。基本上我怀疑它具有内置知识string.IsNullOrEmptyCode Contracts在这里更有可能取得成功,因为与 Code Contracts 的深层推理相比,我认为 FxCop 只对您的代码执行的操作进行相对较浅的检查。你可以装饰你的IsNullOrEmpty方法ValidatedNotNullAttribute来通知 FxCop 发生了什么。

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

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

  • 更改您的代码以绕过代码分析工具,即使它之前没问题
  • 在手动检查每个规则后,抑制特定站点的规则
  • 如果它们经常给出误报,则禁止整个规则
  • 完全放弃代码分析工具

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

于 2013-03-03T17:47:58.270 回答
0

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

此处的错误报告: https ://github.com/dotnet/roslyn-analyzers/issues/2369

于 2019-07-17T10:17:13.397 回答