다음을 통해 공유


CA1508: 데드 조건부 코드 방지

속성
규칙 ID CA1508
제목 데드 조건부 코드 방지
범주 유지 관리
수정 사항이 주요 변경인지 여부 작업을 중단하지 않는 변경
.NET 9에서 기본적으로 사용 아니요

원인

메서드에는 항상 런타임에 true 또는 false로 계산되는 조건부 코드가 있습니다. 이렇게 하면 조건의 false 분기에서 데드 코드가 발생합니다.

기본적으로 이 규칙은 전체 코드베이스를 분석하지만 이는 구성 가능합니다.

규칙 설명

메서드에는 if 문, 이진 식(==, !=, <, >), null 검사 등의 조건부 코드가 있을 수 있습니다. 예를 들어 다음 코드를 살펴보겠습니다.

public void M(int i, int j)
{
    if (i != 0)
    {
        return;
    }

    if (j != 0)
    {
        return;
    }

    // Below condition will always evaluate to 'false' as 'i' and 'j' are both '0' here.
    if (i != j)
    {
        // Code in this 'if' branch is dead code.
        // It can either be removed or refactored.
        ...
    }
}

C# 및 VB 컴파일러는 항상 또는 true로 평가되는 컴파일 시간 ‘상수 값’을 포함하는 조건부 검사를 분석합니다.false 이 분석기는 비상수 변수에 대한 데이터 흐름을 분석하여 ‘상수가 아닌 값’과 관련된 중복 조건부 검사를 확인합니다. 위의 코드에서 분석기는 i 확인에 도달하는 모든 코드 경로에 대해 j0가 모두 i != j인지 확인합니다. 따라서 해당 검사는 런타임에 항상 false로 계산됩니다. If 문 내의 코드는 데드 코드이며 제거하거나 리팩터링할 수 있습니다. 마찬가지로 분석기는 변수의 nullness를 추적하고 중복된 null 검사를 보고합니다.

참고 항목

이 분석기는 비상수 값에 대한 비용이 많이 드는 데이터 흐름 분석을 수행합니다. 이렇게 하면 특정 코드 베이스에 대한 전체 컴파일 시간이 늘어날 수 있습니다.

경고를 표시하지 않는 경우

코드의 유지 관리가 중요하지 않은 경우 이 규칙의 위반을 표시하지 않아도 됩니다. 가양성으로 식별된 위반을 중지해도 괜찮습니다. 여러 스레드에서 실행될 수 있는 동시 코드가 있을 수 있습니다.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

#pragma warning disable CA1508
// The code that's violating the rule is on this line.
#pragma warning restore CA1508

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 none에서 심각도를 으로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA1508.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

분석할 코드 구성

다음 옵션을 사용하여 이 규칙이 실행될 코드베이스 부분을 구성합니다.

또한 다음 데이터 흐름 분석 관련 옵션이 이 규칙에 적용됩니다.

이 규칙, 적용되는 모든 규칙 또는 해당 규칙이 적용되는 이 범주의 모든 규칙(유지 관리 기능)에 대해 이러한 옵션을 구성할 수 있습니다. 자세한 내용은 코드 품질 규칙 구성 옵션을 참조하세요.

특정 기호 제외

excluded_symbol_names 옵션을 설정하여 분석에서 형식 및 메서드와 같은 특정 기호를 제외할 수 있습니다. 예를 들어 MyType이라는 형식 내 코드에서 규칙을 실행하지 않도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

참고 항목

XXXX CAXXXX 부분을 해당 규칙의 ID로 바꿉니다.

옵션 값의 허용되는 기호 이름 형식(|로 구분):

  • 기호 이름만(포함하는 형식 또는 네임스페이스와 관계없이 해당 이름의 모든 기호 포함).
  • 기호의 설명서 ID 형식에 있는 정규화된 이름. 각 기호 이름에는 메서드의 경우 M:, 형식의 경우 T:, 네임스페이스의 경우 N:과 같은 기호 종류 접두사가 필요합니다.
  • 생성자의 경우 .ctor이고 정적 생성자의 경우 .cctor입니다.

예:

옵션 값 요약
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType MyType이라는 모든 기호와 일치합니다.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 MyType1 또는 MyType2라는 모든 기호와 일치합니다.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) 특정 메서드 MyMethod를 지정된 정규화된 시그니처와 비교합니다.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) 특정 메서드 MyMethod1MyMethod2를 개별 정규화된 시그니처와 비교합니다.

특정 형식 및 해당 파생 형식 제외

excluded_type_names_with_derived_types 옵션을 설정하여 분석에서 특정 형식 및 해당 파생 형식을 제외할 수 있습니다. 예를 들어 MyType이라는 형식 및 해당 파생 형식 내에 있는 메서드에서 규칙이 실행되지 않도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

참고 항목

XXXX CAXXXX 부분을 해당 규칙의 ID로 바꿉니다.

옵션 값의 허용되는 기호 이름 형식(|로 구분):

  • 형식 이름만(포함하는 형식이나 네임스페이스와 관계없이 해당 이름의 모든 형식 포함)
  • 기호의 설명서 ID 형식에 있는 정규화된 이름(선택적 T: 접두사 포함)

예:

옵션 값 요약
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType MyType이라는 모든 형식 및 모든 해당 파생 형식과 일치합니다.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 MyType1 또는 MyType2라는 모든 형식 및 모든 해당 파생 형식과 일치합니다.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType 지정된 정규화된 이름의 특정 MyType 형식 및 모든 해당 파생 형식과 일치합니다.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 개별 정규화된 이름의 특정 MyType1, MyType2 형식 및 모든 해당 파생 형식과 일치합니다.

참고 항목