코드 분석 위반 표시 안 함

코드를 만들 때 팀과 공동 작업하는 경우 경고가 적용되지 않음을 나타내는 것이 유용한 경우가 많습니다. 코드 분석 위반을 표시하지 않으면 팀 구성원에게 코드가 검토되었음을 알리고 경고를 표시하지 않을 수 있습니다. 다음 섹션에서는 Visual Studio IDE를 사용하여 코드 분석 위반을 억제하는 다양한 방법에 대해 설명합니다.

EditorConfig 파일을 사용하여 위반 표시 안 함

솔루션 또는 프로젝트에 대한 EditorConfig 파일에서 구성하려는 각 규칙에 대한 항목을 추가하고 심각도를 none으로 설정합니다. 예들 들어 dotnet_diagnostic.CA1822.severity = none입니다. 자세한 내용은 EditorConfig 파일에서 규칙 심각도 수동 구성을 참조하세요. EditorConfig 파일을 추가하려면 프로젝트에 EditorConfig 파일 추가를 참조하세요.

소스 코드에서 위반 표시 안 함

특정 코드 줄에 대한 위반을 표시하지 않는 전처리기 지시문을 사용하여 소스 코드에서 위반을 표시하지 않을 수 있습니다.

또는 SuppressMessageAttribute 특성을 사용하여 C# 및 Visual Basic 코드에서 경고를 표시하지 않을 수 있습니다.

코드 편집기를 사용하여 위반 비표시

코드 편집기를 사용하여 위반을 표시하지 않으면 다음 단계를 수행합니다.

  1. 위반이 있는 코드 줄에 커서를 놓고 Ctrl+마침표(.) 또는 Alt+Enter를 눌러 빠른 작업 메뉴를 엽니다.

  2. 문제 비표시 또는 구성><규칙 번호> 비표시를 선택한 다음 소스 또는 소스(특성)에서 선택합니다.

    • 소스에서를 선택하는 경우 코드에 추가된 전처리기 지시문의 프리뷰가 표시됩니다.

      빠른 작업 비표시 메뉴의 소스 선택 영역에 표시된 스크린샷

    • 소스(특성)에서를 선택하는 경우 코드에 추가된 SuppressMessageAttribute 특성의 프리뷰가 표시됩니다.

      빠른 작업 비표시 메뉴의 소스(특성) 선택 영역을 보여주는 스크린샷

오류 목록을 사용하여 위반 비표시

오류 목록 창을 사용하여 위반을 표시하지 않으려면 다음 단계를 수행합니다.

  1. 오류 목록 창에서 표시하지 않을 규칙을 선택합니다.

  2. 마우스 오른쪽 단추를 클릭한 다음 비표시>소스에서를 선택합니다.

    변경 사항 프리뷰 대화 상자가 열리고 소스 코드에 추가된 C# #pragma 경고 지시문 또는 Visual Basic #Disable 경고 지시문의 프리뷰가 표시됩니다.

    코드 파일에 #pragma 경고를 추가하기 위한 변경 내용 프리뷰 대화 상자를 보여 주는 스크린샷

  3. 적용을 선택하여 코드 파일에 대한 변경 내용을 저장합니다.

오류 목록 빌드 진단 제외

오류 목록 창에 비표시가 표시되지 않으면 위반이 실시간 분석이 아닌 빌드에서 발생한 것일 수 있습니다. 오류 목록 창은 실시간 코드 분석과 빌드 모두에서 진단 또는 규칙 위반을 표시합니다. 빌드 진단은 부실할 수 있기 때문입니다. 예를 들어 위반 문제를 해결하기 위해 코드를 편집했지만 다시 빌드하지 않은 경우에는 오류 목록에서 이러한 진단을 항상 표시하지 않을 수 있습니다.

실시간 분석 또는 IntelliSense의 진단은 항상 최신 소스로 최신 상태를 유지하며 오류 목록에서 항상 표시되지 않을 수 있습니다. 선택 영역에서 빌드 진단을 제외하려면 다음 단계를 수행합니다.

  1. 오류 목록 소스 필터 드롭다운 목록의 빌드 + IntelliSense에서 IntelliSense만으로 선택 영역을 변경합니다.

    오류 목록 소스 필터를 보여 주는 스크린샷

  2. 앞에서 설명한 대로 표시하지 않을 진단을 선택하고 계속 진행합니다.

전역 비표시 파일을 사용하여 위반 표시 안 함

전역 비표시 파일SuppressMessageAttribute 특성을 사용하여 코드 위반을 표시하지 않습니다.

코드 편집기에서 전역 비표시 파일 사용

오류 목록 창을 사용하여 전역 비표시 파일로 위반을 표시하지 않으려면 다음 단계를 수행합니다.

  1. 코드 편집기에서 위반이 있는 코드 줄에 커서를 놓고 Ctrl+마침표(.) 또는 Alt+Enter를 눌러 빠른 작업 메뉴를 엽니다.

  2. <규칙 번호> 비표시를 선택한 다음 비표시 파일에서를 선택합니다.

    Visual Studio는 새 전역 비표시 파일을 포함하는 코드 편집기에서 탭을 만듭니다.

오류 목록에서 전역 비표시 파일 사용

오류 목록 창을 사용하여 전역 비표시 파일로 위반을 표시하지 않으려면 다음 단계를 수행합니다.

  1. 오류 목록 창에서 표시하지 않을 규칙을 선택합니다.

  2. 마우스 오른쪽 단추를 클릭한 다음, 비표시>비표시 파일에서를 선택합니다.

    변경 사항 프리뷰 대화 상자가 열리고 전역 비표시 파일에 추가된 SuppressMessageAttribute 속성의 프리뷰가 표시됩니다.

    제거 파일에 SuppressMessageAttribute 특성이 있는 변경 내용 프리뷰 대화 상자를 보여 주는 스크린샷

  3. 적용을 선택하여 전역 비표시 파일을 저장합니다.

모든 현재 위반 비표시

현재의 모든 위반을 표시하지 않는 것을 베이스라이닝이라고도 합니다. 솔루션 또는 프로젝트의 모든 현재 위반을 표시하지 않으면 다음 단계를 수행합니다.

  1. Visual Studio 메뉴 모음에서 분석>활성 문제 빌드 및 비표시를 선택합니다.

  2. 솔루션에 대해를 선택하여 전체 솔루션에 대한 위반을 표시하지 않거나 <프로젝트 이름>에 대해를 선택하여 프로젝트에 대한 위반만 표시하지 않습니다.

프로젝트 설정을 사용하여 위반 표시 안 함

솔루션 탐색기 프로젝트 설정을 사용하여 위반을 표시하지 않으면 다음 단계를 수행합니다.

  1. 솔루션 탐색기에서 프로젝트를 선택합니다.

  2. 마우스 오른쪽 단추를 클릭한 다음 속성을 선택합니다(또는 Alt + Enter 누르기).

  3. 속성 창에서 왼쪽 창의 Code Analysis를 선택한 다음 생성된 코드에서 결과 비표시의 선택을 취소합니다.

규칙 집합을 사용하여 위반 표시 안 함

규칙 집합 편집기에서 이름 옆에 있는 확인란의 선택을 취소하거나 작업없음으로 설정합니다.

In-source suppression 및 SuppressMessageAttribute 특성

In-source suppression(ISS)은 SuppressMessageAttribute 특성을 사용하여 경고를 표시하지 않습니다. 경고를 생성한 코드 세그먼트 근처의 원본 파일에 SuppressMessageAttribute 특성을 추가할 수 있습니다.

코드 편집기에서 특성을 수동으로 입력하거나 다음과 같이 특성을 자동으로 추가할 수 있습니다.

  1. 코드 편집기에서 위반이 있는 코드 줄에 커서를 놓고 Ctrl+마침표(.) 또는 Alt+Enter를 눌러 빠른 작업 메뉴를 엽니다.

  2. 빠른 작업 메뉴에서 문제 비표시 또는 구성><규칙 번호> 비표시를 선택합니다.

  3. 다음 단계 중 하나를 수행합니다.

    • 소스에서(특성)를 선택합니다.

      Visual Studio는 코드에 SuppressMessageAttribute 특성을 추가합니다.

    • 비표시 파일에서를 선택합니다.

      Visual Studio는 SuppressMessageAttribute 특성이 있는 새 전역 비표시 파일을 포함하는 코드 편집기에서 탭을 만듭니다.

SuppressMessageAttribute 특성은 조건부 특성이며, 관리 코드 어셈블리의 메타데이터에 포함되어 있습니다. 이 특성은 컴파일 시 CODE_ANALYSIS 컴파일 기호가 정의된 경우에만 포함됩니다.

C++ 및 CLI 코드에서만 헤더 파일의 매크로 CA_SUPPRESS_MESSAGE 또는 CA_GLOBAL_SUPPRESS_MESSAGE를 사용하여 특성을 추가합니다.

프로젝트를 최신 버전의 Visual Studio로 마이그레이션하는 경우 많은 코드 분석 경고가 표시될 수 있습니다. 경고를 해결할 준비가 되지 않은 경우에는 분석>빌드 및 활성 문제 표시 안 함을 선택하여 경고를 모두 표시하지 않을 수 있습니다.

참고 항목

in-source suppression 메타데이터를 실수로 전달하지 않기 위해서는 릴리스 빌드에서 in-source suppression를 사용하면 안 됩니다.

SuppressMessageAttribute 특성 형식

SuppressMessageAttribute 특성의 형식은 다음과 같습니다.

[Scope:SuppressMessage("Rule Category", "Rule Id", Justification = "Justification", MessageId = "MessageId", Scope = "Scope", Target = "Target")]

특성의 속성은 다음과 같습니다.

  • Category: 규칙의 범주입니다. 코드 분석 규칙 범주에 대한 자세한 내용은 코드 품질 규칙을 참조하세요.

  • CheckId:: 규칙의 식별자입니다. 지원에는 규칙 식별자에 대한 약식 이름과 긴 이름이 모두 포함됩니다. 짧은 이름은 CAXXXX이고, 긴 이름은 CAXXXX:FriendlyTypeName입니다.

  • Justification: 메시지를 표시하지 않는 이유를 문서화하는 데 사용되는 텍스트입니다.

  • MessageId: 각 메시지 문제의 고유 식별자입니다.

  • Scope: 경고가 표시되지 않는 대상입니다. 대상이 지정되지 않은 경우 시스템에서 특성의 대상으로 설정됩니다. 지원되는 범위에는 다음이 포함됩니다:

    • module: 이 범위는 어셈블리에 대한 경고를 표시하지 않습니다. 전체 프로젝트에 적용되는 전역 비표시입니다.

    • resource: (레거시 FxCop만 해당) 이 범위는 모듈(어셈블리)의 일부인 리소스 파일에 기록된 진단 정보의 경고를 표시하지 않습니다. 이 범위는 소스 파일만 분석하는 Roslyn 분석기 진단용 C#/VB 컴파일러에서는 읽거나 인식되지 않습니다.

    • type: 이 범위는 형식에 대한 경고를 표시하지 않습니다.

    • member: 이 범위는 구성원에 대한 경고를 표시하지 않습니다.

    • namespace: 이 범위는 네임스페이스 자체에 대한 경고를 표시하지 않습니다. 네임스페이스 내의 형식에 대한 경고를 표시하지 않습니다.

    • namespaceanddescendants: (컴파일러 버전 3.x 이상 및 Visual Studio 2019 이상 필요) 이 범위는 네임스페이스 및 모든 하위 항목 기호에서 경고를 표시하지 않습니다. 레거시 분석은 namespaceanddescendants 값을 무시합니다.

  • Target: 경고가 표시되지 않는 대상을 지정하는 식별자입니다. 정규화된 컴포넌트 이름을 포함해야 합니다.

Visual Studio에서 경고가 표시되면 전역 비표시 파일에 비표시를 추가하여 SuppressMessageAttribute의 예를 볼 수 있습니다. 비표시 특성 및 필수 속성은 미리 보기 창에 표시됩니다.

SuppressMessageAttribute 사용

코드 분석 경고는 SuppressMessageAttribute 특성이 적용되는 수준에서 표시되지 않습니다. 예를 들어 특성을 어셈블리, 모듈, 형식, 멤버 또는 매개 변수 수준에서 적용할 수 있습니다. 이 속성을 적용하는 목적은 위반이 발생한 코드에 억제 정보를 긴밀하게 연결하기 위한 것입니다.

일반 표시 형식에는 규칙 범주 및 규칙 식별자(사람이 읽을 수 있는 규칙 이름)가 포함되어 있습니다. 예시:

[SuppressMessage("Microsoft.Design", "CA1039:ListsAreStrongTyped")]

in-source suppressio 메타데이터를 최소화하는 엄격한 성능상의 이유가 있는 경우 규칙 이름을 생략할 수 있습니다. 규칙 카테고리와 해당 규칙 ID를 함께 사용하면 충분히 고유한 규칙 식별자를 구성할 수 있습니다. 예시:

[SuppressMessage("Microsoft.Design", "CA1039")]

유지 관리상의 이유로, 규칙 이름을 생략하는 것은 권장되지 않습니다.

메서드 본문 내에서 선택적 위반 표시 안 함

비표시 특성은 메서드에 적용할 수 있지만 메서드 본문 내에 포함할 수는 없습니다. SuppressMessageAttribute메서드에 속성을 추가하면 특정 규칙의 모든 위반이 억제됩니다.

경우에 따라 특정 위반 사례를 억제하고 싶을 수도 있습니다. 향후 코드가 코드 분석 규칙에서 자동으로 면제되지 않는 경우를 예로 들어 보겠습니다. MessageIdSuppressMessageAttribute특정 코드 분석 규칙에서는 속성의 속성을 사용하여 위반의 특정 인스턴스를 억제할 수 있습니다. 일반적으로 특정 기호(지역 변수 또는 매개 변수)의 위반에 대한 레거시 규칙은 MessageId 속성을 따릅니다. CA1500:VariableNamesShouldNotMatchFieldNames는 이러한 규칙의 예입니다. 그러나 실행 코드(비 기호)의 위반에 대한 레거시 규칙은 MessageId 속성을 준수하지 않습니다. 또한 .NET Compiler Platform("Roslyn") 분석기는 MessageId 속성을 준수하지 않습니다.

규칙의 특정 기호 위반을 표시하지 않을 경우 MessageId 특성의 SuppressMessageAttribute 속성에 대한 기호 이름을 지정합니다. 다음 예에서는 CA1500:VariableNamesShouldNotMatchFieldNames의 두 가지 위반이 있는 코드를 보여줍니다. 하나는 name 변수에 대한 위반이고 다른 하나는 age 변수에 대한 위반입니다. age 기호에 대한 위반만 표시되지 않습니다.

public class Animal
{
    int age;
    string name;

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "age")]
    private void PrintInfo()
    {
        int age = 5;
        string name = "Charlie";

        Console.WriteLine($"Age {age}, Name {name}");
    }
}

전역 수준 비표시

관리 코드 분석 도구는 어셈블리, 모듈, 형식, 구성원 또는 매개 변수 수준에서 적용되는 SuppressMessageAttribute 특성을 검사합니다. 또한 리소스 및 네임스페이스에 대한 위반을 제출합니다. 이러한 위반은 전역 수준에서 적용되어야 하며 범위가 지정되고 대상으로 지정됩니다. 예를 들어 다음 메시지는 네임스페이스 위반을 표시하지 않습니다.

[module: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "MyNamespace")]

전역 수준 비표시의 경우

  • namespace 범위가 있는 경고를 표시하지 않으면 네임스페이스 자체에 대한 경고가 표시되지 않습니다. 네임스페이스 내의 형식에 대한 경고를 표시하지 않습니다.

  • Target에는 항상 정규화된 항목 이름이 포함됩니다.

  • 명시적 범위를 지정하여 모든 비표시를 표현할 수 있습니다. 이러한 비표시는 전역 수준에서 유지되어야 합니다. 유형을 수정하여 구성원 수준 비표시를 지정할 수 없습니다.

  • 전역 수준 비표시는 명시적으로 제공된 사용자 소스에 매핑되지 않는 컴파일러 생성 코드를 참조하는 메시지를 표시하지 않는 유일한 방법입니다. 예를 들어 다음 코드는 컴파일러에서 내보낸 생성자에 대한 위반을 표시하지 않습니다.

    [module: SuppressMessage("Microsoft.Design", "CA1055:AbstractTypesDoNotHavePublicConstructors", Scope="member", Target="Microsoft.Tools.FxCop.Type..ctor()")]

전역 비표시(Suppression) 파일

전역 비표시 파일은 전역 수준 비표시이거나 대상을 지정하지 않는 비표시를 유지합니다. 예를 들어 어셈블리 수준 위반에 대한 비표시는 이 파일에 저장됩니다. 또한 일부 ASP.NET 비표시는 양식 뒤에 있는 코드에 대해 프로젝트 수준 설정을 사용할 수 없으므로 이 파일에 저장됩니다. Visual Studio는 오류 목록 창에서 비표시 명령의 프로젝트 비표시 파일에서 옵션을 처음 선택할 때 전역 비표시 파일을 만들고 프로젝트에 추가합니다.

모듈 비표시 범위

module 범위를 사용하여 전체 어셈블리에 대한 코드 품질 위반을 표시하지 않을 수 있습니다.

예를 들어 GlobalSuppressions 프로젝트 파일의 다음 특성은 ASP.NET Core 프로젝트에 대한 ConfigureAwait 위반을 표시하지 않습니다.

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Reliability", "CA2007:Consider calling ConfigureAwait on the awaited task", Justification = "ASP.NET Core doesn't use thread context to store request context.", Scope = "module")]

생성된 코드

관리 코드 컴파일러와 일부 외부 도구는 신속한 코드 개발을 돕기 위해 코드를 생성합니다. GeneratedCodeAttribute소스 파일에 표시되는 컴파일러 생성 코드는 속성으로 표시됩니다

소스 코드 분석의 경우 .editorconfig 파일에서 생성된 코드의 메시지를 표시하지 않을 수 있습니다. 자세한 내용은 생성된 코드 제외를 참조하세요.

레거시 코드 분석의 경우 생성된 코드에 대한 코드 분석 경고 및 오류를 표시하지 않을지 여부를 선택할 수 있습니다. 이러한 경고 및 오류를 표시하지 않는 방법에 대한 자세한 내용은 생성된 코드에 대한 코드 분석 경고 비표시를 참조하세요.

참고 항목

코드 분석은 전체 어셈블리 또는 단일 매개 변수에 적용될 때 GeneratedCodeAttribute를 무시합니다.