Использование наборов правил для задания выполняемых правил C++

В Visual Studio можно создать и изменить настраиваемый набор правил в соответствии с конкретными потребностями проекта, связанными с анализом кода. Наборы правил по умолчанию хранятся в %VSINSTALLDIR%\Team Tools\Static Analysis Tools\Rule Sets.

Visual Studio 2017 версии 15.7 и более поздних версий. Вы можете создавать настраиваемые наборы правил с помощью любого текстового редактора и применять их в сборках командной строки независимо от используемой системы сборки. Дополнительные сведения см. в разделе /analyze:ruleset.

Чтобы создать настраиваемый набор правил C++ в Visual Studio, проект C/C++ должен быть открыт в интегрированной среде разработки Visual Studio. Затем вы открываете стандартный набор правил в редакторе набора правил, а затем добавляете или удаляете определенные правила и при необходимости измените действие, возникающее при анализе кода, определяющем нарушение правила.

Чтобы создать новый настраиваемый набор правил, сохраните его с помощью нового имени файла. Настраиваемый набор правил автоматически назначается проекту.

Создание настраиваемого правила из одного существующего набора правил

  1. В Обозреватель решений откройте контекстное меню проекта и выберите пункт "Свойства".

  2. В диалоговом окне "Страницы свойств" выберите страницу общего свойства анализа> кода конфигурации.>

  3. В раскрывающемся списке "Набор правил" выполните одно из следующих действий.

    • Выберите набор правил, который требуется настроить.

      - или -

    • Нажмите кнопку <"Обзор",> чтобы указать существующий набор правил, который не указан в списке.

  4. Выберите "Открыть ", чтобы отобразить правила в редакторе набора правил.

  1. В Обозреватель решений откройте контекстное меню проекта и выберите пункт "Свойства".

  2. В диалоговом окне "Страницы свойств" выберите страницу свойств>кода конфигурации Для анализа>свойств Майкрософт.

  3. В раскрывающемся списке "Активные правила" выполните одно из следующих действий.

    • Выберите набор правил, который требуется настроить.

      - или -

    • Нажмите кнопку <"Обзор",> чтобы указать существующий набор правил, который не указан в списке.

  4. Выберите "Открыть ", чтобы отобразить правила в редакторе набора правил.

Изменение набора правил в редакторе набора правил

  • Чтобы изменить отображаемое имя набора правил, в меню "Вид " выберите окно свойств. Введите отображаемое имя в поле "Имя ". Обратите внимание, что отображаемое имя может отличаться от имени файла.

  • Чтобы добавить все правила группы в настраиваемый набор правил, выберите поле проверка группы. Чтобы удалить все правила группы, снимите поле проверка.

  • Чтобы добавить определенное правило в настраиваемый набор правил, выберите поле проверка правила. Чтобы удалить правило из набора правил, снимите поле проверка.

  • Чтобы изменить действие, выполняемое при нарушении правила в анализе кода, выберите поле "Действие " для правила и выберите одно из следующих значений:

    Предупреждение — создает предупреждение.

    Ошибка — создает ошибку.

    Сведения — создает сообщение.

    Нет — отключает правило. Это действие аналогично удалению правила из набора правил.

Группирование, фильтрация или изменение полей в редакторе набора правил с помощью панели инструментов редактора набора правил

  • Чтобы развернуть правила во всех группах, нажмите кнопку "Развернуть все".

  • Чтобы свернуть правила во всех группах, нажмите кнопку Свернуть все.

  • Чтобы изменить поле, по которому сгруппированы правила, выберите поле из списка "Группа по ". Чтобы отобразить правила без группирования, выберите "Нет>".<

  • Чтобы добавить или удалить поля в столбцах правил, выберите "Параметры столбца".

  • Чтобы скрыть правила, которые не применяются к текущему решению, выберите "Скрыть правила, которые не применяются к текущему решению".

  • Чтобы переключиться между отображением и скрытием правил, назначенных действием "Ошибка", выберите "Показать правила", которые могут создавать ошибки анализа кода.

  • Чтобы переключиться между отображением и скрытием правил, назначенных действием "Предупреждение", выберите "Показать правила", которые могут создавать предупреждения анализа кода.

  • Чтобы переключиться между отображением и скрытием правил, назначенных действием None , выберите "Показать правила, которые не включены".

  • Чтобы добавить или удалить наборы правил по умолчанию Майкрософт в текущий набор правил, нажмите кнопку "Добавить или удалить дочерние наборы правил".

Создание набора правил в текстовом редакторе

Можно создать настраиваемый набор правил в текстовом редакторе, сохранить его в любом расположении с .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. Его можно использовать для программного создания собственных наборов правил или проверки того, соответствуют ли пользовательские наборы правил правильному формату. Дополнительные сведения см. в статье "Практическое руководство. Создание XML-документа на основе схемы 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>

Сведения об элементе схемы:

Schema, элемент Description
TLocalization Сведения о локализации, включая имя файла набора правил, описание файла набора правил, имя сборки ресурса, содержащую локализованный ресурс, и базовое имя локализованного ресурса.
TRuleHintPaths Пути к файлам, используемые в качестве подсказок для поиска файлов набора правил
TName Имя текущего файла набора правил
TDescription Описание текущего файла набора правил
TInclude Путь к включенном набору правил с действием правила
TIncludeAll Действие правила для всех правил
TRule Идентификатор правила с действием правила
TRules Коллекция одного или нескольких правил
TRuleSet Формат файла набора правил, состоящий из сведений о локализации, пути указания правил, включают все сведения, включают сведения, сведения о правилах, имя, описание и сведения о версиях средств
TRuleAction Перечисление, описывающее действие правила, например ошибку, предупреждение, сведения, скрытые или нет
TIncludeAction Перечисление, описывающее действие правила, например ошибку, предупреждение, сведения, скрытые, нет или по умолчанию
TIncludeAllAction Перечисление, описывающее действие правила, например ошибку, предупреждение, сведения или скрытые

Чтобы просмотреть пример набора правил, см. статью "Создание набора правил" в текстовом редакторе или любого из наборов правил по умолчанию, хранящихся в %VSINSTALLDIR%\Team Tools\Static Analysis Tools\Rule Sets.