Usar conjuntos de regras para especificar as regras do C++ para execução

No Visual Studio, você pode criar e modificar um conjunto de regras personalizado para atender às necessidades específicas do projeto associadas à análise de código. Os conjuntos de regras padrão são armazenados em %VSINSTALLDIR%\Team Tools\Static Analysis Tools\Rule Sets.

Visual Studio 2017 versão 15.7 e posterior: é possível criar conjuntos de regras personalizados usando qualquer editor de texto e aplicando em compilações de linha de comando, independentemente do sistema de compilação que você está usando. Para obter mais informações, consulte /analyze:ruleset.

Para criar um conjunto de regras C++ personalizado no Visual Studio, um projeto em C/C++ deve estar aberto na IDE do Visual Studio. Depois, abra um conjunto de regras padrão no editor de conjunto de regras e, em seguida, adicione ou remova regras específicas e, opcionalmente, altere a ação que ocorre quando a análise de código determina que uma regra foi violada.

Para criar um novo conjunto de regras personalizado, salve-o usando um novo nome de arquivo. O conjunto de regras personalizado é atribuído automaticamente ao projeto.

Para criar uma regra personalizada a partir de um único conjunto de regras existente

  1. No Gerenciador de Soluções, abra o menu de atalho do projeto e escolha Propriedades.

  2. Na caixa de diálogo Páginas de Propriedades, selecione a página de propriedade Propriedades de Configuração>Code Analysis>Geral.

  3. Na lista suspensa Conjunto de regras, escolha uma das seguintes opções:

    • Escolha o conjunto de regras que você deseja personalizar.

      - ou -

    • Escolha <Procurar...> para especificar um conjunto de regras existente que não está na lista.

  4. Escolha Abrir para exibir as regras no editor de conjunto de regras.

  1. No Gerenciador de Soluções, abra o menu de atalho do projeto e escolha Propriedades.

  2. Na caixa de diálogo Páginas de Propriedades, selecione a página de propriedade Propriedades de Configuração>Code Analysis>Microsoft.

  3. Na lista suspensa Regras ativas, escolha uma das seguintes opções:

    • Escolha o conjunto de regras que você deseja personalizar.

      - ou -

    • Escolha <Procurar...> para especificar um conjunto de regras existente que não está na lista.

  4. Escolha Abrir para exibir as regras no editor de conjunto de regras.

Para modificar um conjunto de regras no editor de conjunto de regras

  • Para alterar o nome de exibição do conjunto de regras, no menu Exibir, escolha Janela de Propriedades. Insira o nome de exibição na caixa Nome. Observe que o nome de exibição pode diferir do nome de arquivo.

  • Para adicionar todas as regras do grupo a um conjunto de regras personalizado, marque a caixa de seleção do grupo. Para remover todas as regras do grupo, desmarque a caixa de seleção.

  • Para adicionar uma regra específica ao conjunto de regras personalizado, marque a caixa de seleção da regra. Para remover a regra do conjunto de regras, desmarque a caixa de seleção.

  • Para alterar a ação executada quando uma regra for violada em uma análise de código, escolha o campo Ação para a regra e escolha um dos seguintes valores:

    Aviso – gera um aviso.

    Erro – gera um erro.

    Info – gera uma mensagem.

    Nenhum – desabilita a regra. Essa ação é a mesma que remover a regra do conjunto de regras.

Para agrupar, filtrar ou alterar os campos no editor de conjunto de regras usando a barra de ferramentas do editor de conjunto de regras

  • Para expandir as regras em todos os grupos, escolha Expandir Tudo.

  • Para recolher as regras em todos os grupos, escolha Recolher Tudo.

  • Para alterar o campo pelo qual as regras são agrupadas, escolha o campo na lista Agrupar por. Para exibir as regras desagrupadas, escolha <Nenhum>.

  • Para adicionar ou remover campos em colunas de regras, escolha Opções de Coluna.

  • Para ocultar regras que não se aplicam à solução atual, escolha Ocultar regras que não se aplicam à solução atual.

  • Para alternar entre mostrar e ocultar regras atribuídas à ação de Erro, escolha Mostrar regras que podem gerar erros do Code Analysis.

  • Para alternar entre mostrar e ocultar regras atribuídas à ação de Aviso, escolha Mostrar regras que podem gerar erros do Code Analysis.

  • Para alternar entre mostrar e ocultar regras atribuídas à ação Nenhum, escolha Mostrar regras que não estão habilitadas.

  • Para adicionar ou remover conjuntos de regras padrão da Microsoft ao conjunto de regras atual, escolha Adicionar ou remover conjuntos de regras filho.

Para criar um conjunto de regras em um editor de texto

Você pode criar um conjunto de regras personalizado em um editor de texto, armazená-lo em qualquer local com uma extensão .ruleset e aplicar com a opção do compilador /analyze:ruleset.

O exemplo a seguir mostra um arquivo de conjunto de regras básico que você pode usar como ponto de partida:

<?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>

Esquema de conjunto de regras

O esquema de conjunto de regras a seguir descreve o esquema XML de um arquivo de conjunto de regras. O esquema de conjunto de regras é armazenado em %VSINSTALLDIR%\Team Tools\Static Analysis Tools\Schemas\RuleSet.xsd. Você pode usá-lo para criar seus próprios conjuntos de regras programaticamente ou para validar se os conjuntos de regras personalizados seguem o formato correto. Para obter mais informações, consulte Como criar um documento XML com base em um esquema XSD.

<?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>

Detalhes do elemento schema:

Elemento Schema Descrição
TLocalization Informações de localização, incluindo o nome do arquivo de conjunto de regras, a descrição do arquivo de conjunto de regras, o nome do assembly de recursos que contém o recurso localizado e o nome base do recurso localizado
TRuleHintPaths Caminhos de arquivo usados como dicas para pesquisar arquivos de conjunto de regras
TName Nome do arquivo de conjunto de regras atual
TDescription Descrição do arquivo de conjunto de regras atual
TInclude Caminho para um conjunto de regras incluído com ação de regra
TIncludeAll Ação de regra para todas as regras
TRule ID da regra com ação de regra
TRules Coleção de uma ou mais regras
TRuleSet O formato de arquivo de conjunto de regras que consiste em informações de localização, caminhos de dica de regra, inclui todas as informações, inclui informações, informações de regras, nome, descrição e informações de versão das ferramentas
TRuleAction Enumeração que descreve uma ação de regra como um erro, aviso, informação, oculto ou nenhum
TIncludeAction Enumeração que descreve uma ação de regra como um erro, aviso, informação, oculto, nenhum ou padrão
TIncludeAllAction Enumeração que descreve uma ação de regra como um erro, aviso, informação ou oculto

Para ver um exemplo de um conjunto de regras, consulte Para criar um conjunto de regras em um editor de texto, ou qualquer um dos conjuntos de regras padrão armazenados em %VSINSTALLDIR%\Team Tools\Static Analysis Tools\Rule Sets.