규칙 집합을 사용하여 실행할 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. 속성 페이지 대화 상자에서 구성 속성>코드 분석>일반 속성 페이지를 선택합니다.

  3. 규칙 집합 드롭다운 목록에서 다음 중 하나를 수행합니다.

    • 사용자 지정하려는 규칙 집합을 선택합니다.

      - 또는 -

    • 찾아보기를> 선택하여 <목록에 없는 기존 규칙 집합을 지정합니다.

  4. 열기를 선택하여 규칙 집합 편집기에서 규칙을 표시합니다.

  1. 솔루션 탐색기 프로젝트의 바로 가기 메뉴를 열고 속성을 선택합니다.

  2. 속성 페이지 대화 상자에서 구성 속성>코드 분석>Microsoft 속성 페이지를 선택합니다.

  3. 활성 규칙 드롭다운 목록에서 다음 중 하나를 수행합니다.

    • 사용자 지정하려는 규칙 집합을 선택합니다.

      - 또는 -

    • 찾아보기를> 선택하여 <목록에 없는 기존 규칙 집합을 지정합니다.

  4. 열기를 선택하여 규칙 집합 편집기에서 규칙을 표시합니다.

규칙 집합 편집기에서 규칙 집합을 수정하려면

  • 규칙 집합의 표시 이름을 변경하려면 보기 메뉴에서 속성 창을 선택합니다. 이름 상자에 표시 이름을 입력합니다. 표시 이름은 파일 이름과 다를 수 있습니다.

  • 그룹의 모든 규칙을 사용자 지정 규칙 집합에 추가하려면 그룹의 검사 상자를 선택합니다. 그룹의 모든 규칙을 제거하려면 검사 상자를 선택 취소합니다.

  • 사용자 지정 규칙 집합에 특정 규칙을 추가하려면 규칙의 검사 상자를 선택합니다. 규칙 집합에서 규칙을 제거하려면 검사 상자를 선택 취소합니다.

  • 코드 분석에서 규칙을 위반할 때 수행되는 작업을 변경하려면 규칙에 대한 작업 필드를 선택한 다음 다음 값 중 하나를 선택합니다.

    경고 - 경고를 생성합니다.

    오류 - 오류를 생성합니다.

    정보 - 메시지를 생성합니다.

    없음 - 규칙을 사용하지 않도록 설정합니다. 이 작업은 규칙 집합에서 규칙을 제거하는 것과 같습니다.

규칙 집합 편집기 도구 모음을 사용하여 규칙 집합 편집기에서 필드를 그룹화, 필터링 또는 변경하려면

  • 모든 그룹에서 규칙을 확장하려면 모두 확장을 선택합니다.

  • 모든 그룹의 규칙을 축소하려면 모두 축소를 선택합니다.

  • 규칙이 그룹화되는 필드를 변경하려면 그룹화 목록에서 필드를 선택합니다. 그룹화되지 않은 규칙을 표시하려면 [없음>]을 선택합니다<.

  • 규칙 열에서 필드를 추가하거나 제거하려면 열 옵션을 선택합니다.

  • 현재 솔루션에 적용되지 않는 규칙을 숨기려면 현재 솔루션에 적용되지 않는 규칙 숨기기를 선택합니다.

  • 오류 동작이 할당된 규칙 표시와 숨기기 사이를 전환하려면 코드 분석 오류를 생성할 수 있는 규칙 표시를 선택합니다.

  • 경고 작업이 할당된 규칙 표시와 숨기기 사이를 전환하려면 코드 분석 경고를 생성할 수 있는 규칙 표시를 선택합니다.

  • 없음 작업이 할당된 규칙 표시와 숨기기 사이를 전환하려면 사용하도록 설정되지 않은 규칙 표시를 선택합니다.

  • 현재 규칙 집합에 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 지역화 정보, 규칙 힌트 경로로 구성된 규칙 집합 파일 형식, 모든 정보 포함, 정보 포함, 규칙 정보, 이름, 설명 및 도구 버전 정보
TRuleAction 오류, 경고, 정보, 숨김 또는 없음과 같은 규칙 동작을 설명하는 열거형
TIncludeAction 오류, 경고, 정보, 숨김, 없음 또는 기본값과 같은 규칙 동작을 설명하는 열거형
TIncludeAllAction 오류, 경고, 정보 또는 숨김과 같은 규칙 동작을 설명하는 열거형

규칙 집합 의 예를 보려면 텍스트 편집기에서 규칙 집합을 만들거나 저장된 %VSINSTALLDIR%\Team Tools\Static Analysis Tools\Rule Sets기본 규칙 집합을 참조하세요.