使用规则集指定要运行的 C++ 规则

在 Visual Studio 中,可以创建和修改自定义规则集,以满足与代码分析相关联的特定项目需要。 默认规则集存储在 %VSINSTALLDIR%\Team Tools\Static Analysis Tools\Rule Sets 中。

Visual Studio 2017 版本 15.7 及更高版本:无论使用哪种生成系统,都可以使用任何文本编辑器创建自定义规则集,并在命令行生成中应用这些规则集。 有关详细信息,请参阅 /analyze:ruleset

若要在 Visual Studio 中创建自定义 C++ 规则集,必须在 Visual Studio IDE 中打开 C/C++ 项目。 然后,在规则集编辑器中打开某一标准规则集,再添加或移除特定的规则,并且可更改当代码分析确定违反规则时所发生的操作。

若要创建新的自定义规则集,请使用新文件名保存该规则集。 自定义规则集会自动分配给项目。

从单个现有规则集创建自定义规则的步骤

  1. 在“解决方案资源管理器”中,打开项目的快捷菜单,然后选择“属性”。

  2. 在“属性页”对话框中,选择“配置属性”>“Code Analysis”>“常规”属性页。

  3. 在“规则集”下拉列表中,执行以下操作之一

    • 选择要自定义的规则集。

      - 或 -

    • 选择“<浏览...>”,指定列表外部的现有规则集。

  4. 选择“打开”以在规则集编辑器中显示规则。

  1. 在“解决方案资源管理器”中,打开项目的快捷菜单,然后选择“属性”。

  2. 在“属性页”对话框中,选择“配置属性”>“Code Analysis”>“Microsoft”属性页。

  3. 在“活动规则”下拉列表中,执行以下操作之一

    • 选择要自定义的规则集。

      - 或 -

    • 选择“<浏览...>”,指定列表外部的现有规则集。

  4. 选择“打开”以在规则集编辑器中显示规则。

在规则集编辑器中修改规则集的步骤

  • 若要更改规则集的显示名称,请在“视图”菜单上选择“属性窗口”。 在“名称”框中输入显示名称。 请注意,显示名称可能与文件名不同。

  • 若要将组的所有规则添加到自定义规则集,请选中组的复选框。 若要删除组的所有规则,请清除该复选框。

  • 若要将特定规则添加到自定义规则集,请选中规则的复选框。 若要从规则集中删除规则,请清除该复选框。

  • 若要更改在代码分析中违反规则时所采取的操作,请选择规则的“操作”字段,然后选择下列值之一:

    警告 - 生成警告。

    错误 - 生成错误。

    信息 - 生成消息。

    - 禁用此规则。 此操作与从规则集中删除规则相同。

使用规则集编辑器工具栏对规则集编辑器中的字段进行分组、筛选或更改

  • 若要展开所有组中的规则,请选择“全部展开”。

  • 若要折叠所有组中的规则,请选择“全部折叠”。

  • 若要更改规则分组所依据的字段,请从“分组依据”列表中选择字段。 若要显示未分组的规则,请选择“<无>”。

  • 若要在规则列中添加或移除字段,请选择“列选项”。

  • 若要隐藏不适用于当前解决方案的规则,请选择“隐藏不适用于当前解决方案的规则”。

  • 若要在显示和隐藏分配了“错误”操作的规则之间进行切换,请选择“显示可以生成 Code Analysis 错误的规则”。

  • 若要在显示和隐藏分配了“警告”操作的规则之间进行切换,请选择“显示可以生成 Code Analysis 警告的规则”。

  • 若要在显示和隐藏分配了“无”操作的规则之间进行切换,请选择“显示未启用的规则”。

  • 若要在当前规则集内添加或移除 Microsoft 默认规则集,请选择“添加或移除子规则集”。

在文本编辑器中创建规则集的步骤

可以在文本编辑器中创建自定义规则集,将它存储在具有 .ruleset 扩展的任何位置,并使用 /analyze:ruleset 编译器选项应用它。

以下示例演示了一个基本规则集文件,可从其着手进行操作:

<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="New Rule Set" Description="New rules to apply." ToolsVersion="10.0">
  <Rules AnalyzerId="Microsoft.Analyzers.NativeCodeAnalysis" RuleNamespace="Microsoft.Rules.Native">
    <Rule Id="C6001" Action="Warning" />
    <Rule Id="C26494" Action="Warning" />
  </Rules>
</RuleSet>

规则集架构

以下规则集架构描述规则集文件的 XML 架构。 规则集架构存储在 %VSINSTALLDIR%\Team Tools\Static Analysis Tools\Schemas\RuleSet.xsd 中。 你可以使用它以编程方式创作自己的规则集,或验证自定义规则集是否遵循正确的格式。 有关详细信息,请参阅如何:基于 XSD 架构创建 XML 文档

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:annotation>
    <xs:documentation xml:lang="en">
            Visual Studio Code Analysis Rule Set Schema Definition Language.
            Copyright (c) Microsoft Corporation. All rights reserved.
        </xs:documentation>
  </xs:annotation>

  <!-- Every time this file changes, be sure to change the Validate method for the corresponding object in the code -->

  <xs:element name="RuleSet" type="TRuleSet">
  </xs:element>

  <xs:complexType name="TLocalization">
    <xs:all>
      <xs:element name="Name" type="TName" minOccurs="0" maxOccurs="1" />
      <xs:element name="Description" type="TDescription" minOccurs="0" maxOccurs="1" />
    </xs:all>
    <xs:attribute name="ResourceAssembly" type="TNonEmptyString" use="required" />
    <xs:attribute name="ResourceBaseName" type="TNonEmptyString" use="required" />
  </xs:complexType>

  <xs:complexType name="TRuleHintPaths">
    <xs:sequence>
      <xs:element name="Path" type="TNonEmptyString" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="TName">
    <xs:attribute name="Resource" type="TNonEmptyString" use="required" />
  </xs:complexType>

  <xs:complexType name="TDescription">
    <xs:attribute name="Resource" type="TNonEmptyString" use="required" />
  </xs:complexType>

  <xs:complexType name="TInclude">
    <xs:attribute name="Path" type="TNonEmptyString" use="required" />
    <xs:attribute name="Action" type="TIncludeAction" use="required" />
  </xs:complexType>

  <xs:complexType name="TIncludeAll">
    <xs:attribute name="Action" type="TIncludeAllAction" use="required" />
  </xs:complexType>

  <xs:complexType name="TRule">
    <xs:attribute name="Id" type="TNonEmptyString" use="required" />
    <xs:attribute name="Action" type="TRuleAction" use="required" />
  </xs:complexType>

  <xs:complexType name="TRules">
    <xs:sequence>
      <xs:element name="Rule" type="TRule" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="AnalyzerId" type="TNonEmptyString" use="required" />
    <xs:attribute name="RuleNamespace" type="TNonEmptyString" use="required" />
  </xs:complexType>

  <xs:complexType name="TRuleSet">
    <xs:sequence minOccurs="0" maxOccurs="1">
      <xs:element name="Localization" type="TLocalization" minOccurs="0" maxOccurs="1" />
      <xs:element name="RuleHintPaths" type="TRuleHintPaths" minOccurs="0" maxOccurs="1" />
      <xs:element name="IncludeAll" type="TIncludeAll" minOccurs="0" maxOccurs="1" />
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Include" type="TInclude" minOccurs="0" maxOccurs="unbounded" />
        <xs:element name="Rules" type="TRules" minOccurs="0" maxOccurs="unbounded">
          <xs:unique name="UniqueRuleName">
            <xs:selector xpath="Rule" />
            <xs:field xpath="@Id" />
          </xs:unique>
        </xs:element>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="Name" type="TNonEmptyString" use="required" />
    <xs:attribute name="Description" type="xs:string" use="optional" />
    <xs:attribute name="ToolsVersion" type="TNonEmptyString" use="required" />
  </xs:complexType>

  <xs:simpleType name="TRuleAction">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Error"/>
      <xs:enumeration value="Warning"/>
      <xs:enumeration value="Info"/>
      <xs:enumeration value="Hidden"/>
      <xs:enumeration value="None"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="TIncludeAction">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Error"/>
      <xs:enumeration value="Warning"/>
      <xs:enumeration value="Info"/>
      <xs:enumeration value="Hidden"/>
      <xs:enumeration value="None"/>
      <xs:enumeration value="Default"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="TIncludeAllAction">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Error"/>
      <xs:enumeration value="Warning"/>
      <xs:enumeration value="Info"/>
      <xs:enumeration value="Hidden"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="TNonEmptyString">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
    </xs:restriction>
  </xs:simpleType>
  
</xs:schema>

架构元素详细信息:

架构元素 说明
TLocalization 本地化信息,其中包括规则集文件的名称、规则集文件的说明、包含本地化资源的资源程序集的名称,以及本地化资源的基名称
TRuleHintPaths 文件路径,用作搜索规则集文件的提示
TName 当前规则集文件的名称
TDescription 当前规则集文件的说明
TInclude 指向包含的规则集(带规则操作)的路径
TIncludeAll 所有规则的规则操作
TRule 包含规则操作的规则 ID
TRules 一个或多个规则的集合
TRuleSet 规则集文件格式,包含本地化信息、规则提示路径、include all 信息、include 信息、规则信息、名称、说明和工具版本信息
TRuleAction 描述规则操作(如错误、警告、信息、隐藏或无)的枚举
TIncludeAction 描述规则操作(如错误、警告、信息、隐藏、无或默认)的枚举
TIncludeAllAction 描述规则操作(如错误、警告、信息或隐藏)的枚举

若要查看规则集的示例,请参阅在文本编辑器中创建规则集的步骤或存储在 %VSINSTALLDIR%\Team Tools\Static Analysis Tools\Rule Sets 中的任何默认规则集。