規則セットを使用して実行対象の 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 つの規則セットからカスタム規則を作成するには

  1. [ソリューション エクスプローラー] で、プロジェクトのショートカット メニューを開き、[プロパティ]を選択します。

  2. [プロパティ ページ] ダイアログ ボックスで、[構成プロパティ]>[コード分析]>[全般] プロパティ ページを選択します。

  3. [規則セット] ドロップダウン リストで、次のいずれかの操作を行います。

    • カスタマイズするルール セットを選択します。

      または

    • [<参照>] をクリックして、一覧にない、既存のルール セットを指定します。

  4. [開く] を選択して、ルールセット エディターでルールを表示します。

  1. [ソリューション エクスプローラー] で、プロジェクトのショートカット メニューを開き、[プロパティ]を選択します。

  2. [プロパティ ページ] ダイアログ ボックスで、[構成プロパティ]>[コード分析]>[Microsoft] プロパティ ページを選択します。

  3. [アクティブな規則] ドロップダウン リストで、次のいずれかを行います。

    • カスタマイズするルール セットを選択します。

      または

    • [<参照>] をクリックして、一覧にない、既存のルール セットを指定します。

  4. [開く] を選択して、ルールセット エディターでルールを表示します。

規則セット エディターで規則セットを変更するには

  • ルール セットの表示名を変更するには、[表示] メニューの [プロパティ ウィンドウ] を選択します。 [名前] ボックスに表示名を入力します。 表示名には、ファイル名と異なる名前を指定できます。

  • グループ内のすべての規則をカスタム規則セットに追加するには、グループのチェック ボックスをオンにします。 グループ内のすべての規則を削除するには、チェック ボックスをオフにします。

  • 特定の規則をカスタム規則セットに追加するには、その規則のチェック ボックスをオンにします。 規則セットから規則を削除するには、チェック ボックスをオフにします。

  • コード分析でルールへの違反が見つかった場合のアクションを変更するには、対象となるルールの [アクション] フィールドを選択し、次のいずれかの値を選択します。

    [Warning]\(警告\) - 警告を発生させます。

    [Error]\(エラー\) - エラーを発生させます。

    [Info]\(情報\) - メッセージを生成します。

    [None]\(なし\) - ルールを無効にします。 このアクションは、規則セットから規則を削除するのと同じです。

規則セット エディターのツール バーを使用して、規則セット エディターに表示されるフィールドのグループ化、フィルター処理、または変更を行うには

  • すべてのグループのルールを展開するには、[すべて展開] を選択します。

  • すべてのグループのルールを折りたたむには、[すべて折りたたみ] を選択します。

  • ルールのグループ化の基準となるフィールドを変更するには、[グループ化] ボックスの一覧からフィールドを選択します。 ルールのグループ化を解除して表示する場合は [<なし>] を選択します。

  • ルール列のフィールドを追加または削除するには、[列のオプション] を選択します。

  • 現在のソリューションに適用しないルールを隠すには、[現在のソリューションに適用されない規則を非表示にする] を選択します。

  • エラー動作が割り当てられているルールの表示と非表示を切り替えるには、[コード分析エラーを生成する可能性のある規則を表示] を選択します。

  • 警告動作が割り当てられているルールの表示と非表示を切り替えるには、[コード分析警告を生成する可能性のある規則を表示] を選択します。

  • 動作として [なし] が割り当てられているルールの表示と非表示を切り替えるには、[有効化されていない規則を表示] を選択します。

  • 現在のルールセットに 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>

スキーマ要素の詳細:

Schema 要素 説明
TLocalization ルール セット ファイルの名前、ルール セット ファイルの説明、ローカライズされたリソースを含むリソース アセンブリの名前、ローカライズされたリソースのベース名など、ローカライズ情報
TRuleHintPaths ルール セット ファイルを検索するためのヒントとして使用されるファイル パス
TName 現在のルール セット ファイルの名前
TDescription 現在のルール セット ファイルの説明
TInclude ルール アクションを持つ、含まれるルール セットへのパス
TIncludeAll すべてのルールのルール アクション
TRule ルール アクションを含むルール ID
TRules 1 つ以上のルールのコレクション
TRuleSet ローカライズ情報、ルールのヒント パス、ルール情報、名前、説明、ツール バージョン情報を含むルール セット ファイル形式
TRuleAction エラー、警告、情報、非表示、なしなどのルール アクションを説明するリスト
TIncludeAction エラー、警告、情報、非表示、なし、既定値などのルール アクションを説明するリスト
TIncludeAllAction エラー、警告、情報、非表示などのルール アクションを説明するリスト

ルール セット例については、「テキスト エディターでルール セットを作成するには」か、%VSINSTALLDIR%\Team Tools\Static Analysis Tools\Rule Sets に保存されている既定のルール セットを参照してください。