Usar conjuntos de reglas para especificar las reglas C++ que se van a ejecutar

En Visual Studio, puede crear y modificar un conjunto de reglas personalizado para satisfacer las necesidades concretas del proyecto asociadas al análisis de código. Los conjuntos de reglas predeterminados se almacenan en %VSINSTALLDIR%\Team Tools\Static Analysis Tools\Rule Sets.

Visual Studio 2017, versión 15.7 y posteriores: puede crear conjuntos de reglas personalizados mediante cualquier editor de texto y aplicarlos en compilaciones de línea de comandos, independientemente del sistema de compilación que use. Para obtener más información, vea /analyze:ruleset.

Para crear un conjunto de reglas de C++ personalizado en Visual Studio, en el IDE de Visual Studio debe estar abierto un proyecto de C/C++. Después, abra un conjunto de reglas estándar en el editor del conjunto de reglas, y agregue o quite reglas específicas; opcionalmente, cambie la acción que se produce cuando el análisis de código determina que se ha infringido una regla.

Para crear un nuevo conjunto de reglas personalizado, guárdelo con un nuevo nombre de archivo. El conjunto de reglas personalizado se asigna automáticamente al proyecto.

Para crear una regla personalizada a partir de un solo conjunto de reglas existente

  1. En el Explorador de soluciones, abra el menú contextual del proyecto y luego elija Propiedades.

  2. En el cuadro de diálogo Páginas de propiedades, seleccione la página Propiedades de configuración>Code Analysis>General.

  3. En la lista desplegable Conjunto de reglas, realice una de las acciones siguientes:

    • Elija el conjunto de reglas que quiera personalizar.

      O bien

    • Elija <Examinar...> para especificar un conjunto de reglas existente que no esté en la lista.

  4. Elija Abrir para mostrar las reglas en el editor de conjuntos de reglas.

  1. En el Explorador de soluciones, abra el menú contextual del proyecto y luego elija Propiedades.

  2. En el cuadro de diálogo Páginas de propiedades, seleccione la página Propiedades de configuración>Code Analysis>Microsoft.

  3. En la lista desplegable Reglas activas, realice una de las acciones siguientes:

    • Elija el conjunto de reglas que quiera personalizar.

      O bien

    • Elija <Examinar...> para especificar un conjunto de reglas existente que no esté en la lista.

  4. Elija Abrir para mostrar las reglas en el editor de conjuntos de reglas.

Para modificar un conjunto de reglas en el editor de conjuntos de reglas

  • Para cambiar el nombre para mostrar del conjunto de reglas, en el menú Ver, elija Ventana Propiedades. En el cuadro Nombre, escriba el nombre para mostrar. Observe que el nombre para mostrar puede diferir del nombre de archivo.

  • Para agregar todas las reglas del grupo a un conjunto de reglas personalizado, active la casilla del grupo. Para quitar todas las reglas del grupo, desactive la casilla.

  • Para agregar una regla concreta al conjunto de reglas personalizado, active la casilla de la regla. Para quitar la regla del conjunto de reglas, desactive la casilla.

  • Para cambiar la acción que se realiza cuando una regla se infringe en un análisis de código, elija el campo Acción de la regla y, después, elija uno de los valores siguientes:

    Advertencia: genera una advertencia.

    Error: genera un error.

    Información: genera un mensaje.

    Ninguno: deshabilita la regla. Esta acción es igual que quitar la regla del conjunto de reglas.

Para agrupar, filtrar o cambiar los campos del editor de conjuntos de reglas mediante la barra de herramientas del editor

  • Para expandir las reglas de todos los grupos, elija Expandir todo.

  • Para contraer las reglas de todos los grupos, elija Contraer todo.

  • Para cambiar el campo por el que se agrupan las reglas, elija el campo en la lista Agrupar por. Para mostrar las reglas desagrupadas, elija <Ninguno>.

  • Para agregar o quitar campos de las columnas de las reglas, elija Opciones de columna.

  • Para ocultar reglas que no se aplican a la solución actual, elija Ocultar reglas que no se aplican a la solución actual.

  • Para alternar entre mostrar y ocultar reglas que tienen asignada la acción Error, elija Mostrar reglas que pueden generar errores de análisis de código.

  • Para alternar entre mostrar y ocultar reglas que tienen asignada la acción Advertencia, elija Mostrar reglas que pueden generar advertencias de análisis de código.

  • Para alternar entre mostrar y ocultar las reglas que tienen asignada la acción Ninguno, elija Mostrar reglas no habilitadas.

  • Para agregar o quitar conjuntos de reglas predeterminados de Microsoft en el conjunto de reglas actual, elija Agregar o quitar conjuntos de reglas secundarios.

Creación de un conjunto de reglas en un editor de texto

Puede crear un conjunto de reglas personalizado en un editor de texto, almacenarlo en cualquier ubicación con una extensión .ruleset y aplicarlo con la opción del compilador /analyze:ruleset.

En el ejemplo siguiente se muestra un archivo de conjunto de reglas básico que puede usar como punto 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 del conjunto de reglas

El esquema del conjunto de reglas siguiente describe el esquema XML de un archivo de conjunto de reglas. El esquema del conjunto de reglas se almacena en %VSINSTALLDIR%\Team Tools\Static Analysis Tools\Schemas\RuleSet.xsd. Puede usarlo para crear sus propios conjuntos de reglas mediante programación o para validar si los conjuntos de reglas personalizados se ciñen al formato correcto. Para obtener más información, vea Procedimientos: Creación de un documento XML basado en un 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>

Detalles del elemento de esquema:

Schema, elemento Descripción
TLocalization Información de localización, incluido el nombre del archivo del conjunto de reglas, la descripción del archivo del conjunto de reglas, el nombre del ensamblado de recursos que incluye el recurso localizado y el nombre base del recurso localizado.
TRuleHintPaths Rutas de acceso de archivo usadas como sugerencias para buscar archivos del conjunto de reglas.
TName Nombre del archivo del conjunto de reglas actual.
TDescription Descripción del archivo del conjunto de reglas actual.
TInclude Ruta de acceso a un conjunto de reglas incluido con la acción de regla.
TIncludeAll Acción de regla para todas las reglas.
TRule Id. de regla con la acción de regla.
TRules Colección de una o varias reglas.
TRuleSet Formato de archivo del conjunto de reglas que se compone de información de localización, rutas de acceso de sugerencia de regla; incluye toda la información, información de reglas, nombre, descripción e información de la versión de herramientas.
TRuleAction Enumeración que describe una acción de regla, como un error, advertencia, información, oculta o ninguna.
TIncludeAction Enumeración que describe una acción de regla, como un error, advertencia, información, oculta, ninguna o predeterminada.
TIncludeAllAction Enumeración que describe una acción de regla, como un error, advertencia, información u oculta.

Para ver un ejemplo de un conjunto de reglas, vea Creación de un conjunto de reglas en un editor de texto o cualquiera de los conjuntos de reglas predeterminados almacenados en %VSINSTALLDIR%\Team Tools\Static Analysis Tools\Rule Sets.