代码分析规则 CA1062 行为
Posted
技术标签:
【中文标题】代码分析规则 CA1062 行为【英文标题】:Code Analysis rule CA1062 behaviour 【发布时间】:2013-03-03 17:44:15 【问题描述】:我有以下字符串的扩展方法:
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 上提交的反馈项目进行投票: Code Analysis rule CA1062 raises false alarm
【问题讨论】:
哪里违规了?在扩展方法中?在调用 to 扩展方法?还是在它之后?每当您在问题中提及错误/警告时,请说明它发生的位置。 看IL代码,代码分析不会对你在你的IDE中看到的代码进行操作,所以也许这会有所帮助。 您可以使用ValidatedNotNullAttribute
让 FxCop 知道。更多信息:esmithy.net/2011/03/15/suppressing-ca1062
【参考方案1】:
为什么它认为我没有在第一个示例中检查 null 条件?
很简单,如果您的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
这只是代码分析有时过于急于批评的一个例子。这是我在使用过的几乎所有代码分析工具中都看到的。您的选择通常是:
更改您的代码以绕过代码分析工具,即使它之前没问题 在手动检查每个规则后抑制特定站点的规则 如果它们经常给出误报,则禁止整个规则 完全放弃代码分析工具当然,您还应该记录错误或功能请求...
【讨论】:
我更新了代码示例,并在导致违规的行上添加了注释。 @Anil:是的——这只是 FxCop 的问题,而不是“理解”你的方法会做什么。 感谢您的解释。我在MS Connect 上提交了一个带有示例项目的反馈项【参考方案2】:看起来他们终于可以在 roslyn 分析器中解决这个问题了。
此处的错误报告: https://github.com/dotnet/roslyn-analyzers/issues/2369
【讨论】:
以上是关于代码分析规则 CA1062 行为的主要内容,如果未能解决你的问题,请参考以下文章