我的 FXCop 规则集有啥问题?

Posted

技术标签:

【中文标题】我的 FXCop 规则集有啥问题?【英文标题】:What's wrong with my FXCop Ruleset?我的 FXCop 规则集有什么问题? 【发布时间】:2014-02-19 17:52:09 【问题描述】:

我正在构建多个规则集文件,它们的规则 ID 相同,但包含的 MS 规则集的级别会增加,并且某些规则的操作的严重性会增加。我遇到的问题是 VS2010 告诉我加载我的 FXCop_VS2010_HIGLevel2.ruleset 文件时出错,而 FXCop_VS2010_HIGLevel1.ruleset 加载正常。它们本质上看起来是一样的:

FXCop_VS2010_HIGLevel1.ruleset

    <?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="HIG VS2010 Code Analysis Rules Level 1" Description="These rules expand on the basic design guideline rules to maximize the usability and maintainability issues that are reported. Extra emphasis is placed on naming guidelines. Consider including this rule set if your project includes library code or if you want to enforce the highest standards for writing maintainable code." ToolsVersion="10.0">
  <Include Path="BasicCorrectnessRules.ruleset" Action="Default" />
  <Include Path="SecurityRules.ruleset" Action="Default" />
  <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
    <Rule Id="CA1000" Action="None" />
    <Rule Id="CA1001" Action="None" />
    ...
    <Rule Id="CA2239" Action="Warning" />
    <Rule Id="CA2240" Action="None" />
    <Rule Id="CA2242" Action="None" />
    <Rule Id="CA2243" Action="None" />
  </Rules>
</RuleSet>

FXCop_VS2010_HIGLevel2.ruleset

    <?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="HIG VS2010 Code Analysis Rules Level 2" Description="These rules expand on the basic design guideline rules to maximize the usability and maintainability issues that are reported. Extra emphasis is placed on naming guidelines. Consider including this rule set if your project includes library code or if you want to enforce the highest standards for writing maintainable code." ToolsVersion="10.0">
  <Include Path="BasicCorrectnessRules.ruleset" Action="Default" />
  <Include Path="BasicDesignGuidelineRules.ruleset" Action="Default" />
  <Include Path="SecurityRules.ruleset" Action="Default" />
  <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
    <Rule Id="CA1000" Action="Warning" />
    <Rule Id="CA1001" Action="None" />
    ...
    <Rule Id="CA2239" Action="Warning" />
    <Rule Id="CA2240" Action="None" />
    <Rule Id="CA2242" Action="None" />
    <Rule Id="CA2243" Action="None" />
  </Rules>
</RuleSet>

您可以看到它们本质上是相同的。级别 2 添加 BasicDesignGuidelineRules.ruleset 并更改某些规则的操作(即 CA1000 从级别 1 的“无”变为级别 2 的“警告”)。

这是我将 2 级规则集文件放入 Static Analysis Tools\Rule Sets 文件夹时从 VS2010 得到的错误:

任何想法为什么会发生这种情况?我逐行浏览了 Level 2 XML,并运行了一个与 Level 1 相比的文件。唯一的区别是我所期望的。我使用 Notepad++ 在适当的地方显示非打印字符,除了 CRLF 之外什么都没有。我难住了。

【问题讨论】:

很遗憾,我无法通过您的帖子中的信息重现问题。您可以通过启用和检查 Visual Studio 活动日志 (msdn.microsoft.com/en-us/library/ms241272(v=vs.100).aspx) 来发现更多详细信息。否则,您能否发布一个更完整的 2 级规则集版本,以便重现问题? 无法附加文件(有吗?),而且我没有办法将其保存在外部以提供链接。内容太多,无法将其发布为代码在评论中。关于如何发布整个文件的任何建议?顺便说一句 - 我能够通过将所有 'Action="CriticalError"' 和 'Action="CriticalWarning"' 分别更改为 "Error" 和 "Warning" 来消除错误。我不知道为什么这突然开始发生。 “CriticalError”和“CriticalWarning”是有效的操作。它们在我最初的规则集中。我添加了额外的规则,突然它们成为 Action 的无效值... 【参考方案1】:

正如您在评论中所说的那样,您说在将操作从 CriticalWarning 更改为 Warning 并将 CriticalError 更改为 Error 后问题得到了解决。

此处解释了此行为:http://msdn.microsoft.com/en-us/library/dd380626.aspx

您一定误认为自定义规则 XML 文件中的 MessageLevel property 的操作。在此属性中,您可以设置以下值:

    严重错误 - 使用此级别报告的问题具有很高的可见性,并且识别的代码在 最常见的场景。这些问题首先要解决。你 不应排除此级别的问题。 错误 - 此级别的问题的可见性和影响较小。但它仍然可以识别您需要解决的代码中的问题。还 如果不仔细考虑,不应排除这些问题。 严重警告 - 此级别主要用于解决代码的可维护性问题。代码工作正常,但 不太理想。仅在小心后排除此类消息 考虑。 警告 - 具有此级别的消息用于识别代码中有关可维护性、可扩展性和稳定性的问题。 信息 - 关于代码的信息性消息。

【讨论】:

我终于在几周前找到并弄清楚了。我忘了更新这个线程。感谢您的回复。

以上是关于我的 FXCop 规则集有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

你最喜欢的 FxCop 规则是啥?

FxCop 自定义规则文档。为啥找不到我的网址?

从 FxCop 中排除规则

忽略某些特定情况的内置 FxCop 规则。自定义 FxCop 规则?

使用 SonarQube 自定义 Fxcop 规则

自定义控件的 FxCop 自定义规则