CA1508 : Éviter le code conditionnel mort

Propriété Value
Identificateur de la règle CA1508
Titre Éviter le code conditionnel mort
Catégorie Maintenabilité
Le correctif est cassant ou non cassant Non cassant
Activé par défaut dans .NET 8 Non

Cause

Une méthode a du code conditionnel qui s’évalue toujours à true ou false au moment de l’exécution. Cela conduit à du code mort dans la branche false de la condition.

Par défaut, cette règle analyse l’intégralité du codebase, mais elle est configurable.

Description de la règle

Les méthodes peuvent avoir du code conditionnel, comme des instructions if, des expressions binaires (==, !=, <, >), des vérifications null, etc. Par exemple, considérez le code suivant :

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.
        ...
    }
}

Les compilateurs C# et VB effectuent une analyse des vérifications conditionnelles impliquant des valeurs constantes au moment de la compilation qui sont toujours évaluées à true ou false. Cet analyseur effectue une analyse de flux de données de variables non constantes pour déterminer les vérifications conditionnelles redondantes impliquant des valeurs non constantes. Dans le code précédent, l’analyseur détermine que i et j sont tous les deux 0 pour tous les chemins de code qui atteignent la vérification i != j. Par conséquent, cette vérification est toujours évaluée à false au moment de l’exécution. Le code à l’intérieur de l’instruction if est du code mort et peut être supprimé ou refactorisé. De même, l’analyseur effectue le suivi de la nullité des variables et signale les vérifications null redondantes.

Notes

Cet analyseur effectue une analyse coûteuse du flux de données des valeurs non constantes. Cela peut augmenter le temps de compilation global sur certaines bases de code.

Quand supprimer les avertissements

Il est sûr de supprimer une violation de cette règle si vous n’êtes pas préoccupé par la maintenance de votre code. Il est également très facile de supprimer les violations qui sont identifiées comme étant de faux positifs. Cela peut se produire en présence d’un code simultané qui peut s’exécuter à partir de plusieurs threads.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

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

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

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

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Configurer le code à analyser

Utilisez l’option suivante pour configurer les parties de votre codebase sur lesquelles exécuter cette règle.

Vous pouvez configurer ces options pour cette règle uniquement, pour toutes les règles auxquelles elles s’appliquent ou pour toutes les règles de cette catégorie (Maintenabilité) auxquelles elles s’appliquent. Pour plus d’informations, consultez Options de configuration des règles de qualité du code.

Exclure des symboles spécifiques

Vous pouvez exclure de l’analyse des symboles spécifiques, comme des types et des méthodes. Par exemple, pour spécifier que la règle ne doit pas s’exécuter sur du code dans des types nommés MyType, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

Formats de nom de symbole autorisés dans la valeur d’option (séparés par |) :

  • Nom du symbole uniquement (inclut tous les symboles avec le nom, quel que soit le type ou l’espace de noms qui les contient).
  • Noms qualifiés complets au format d’ID de documentation du symbole. Chaque nom de symbole nécessite un préfixe de type symbole, comme M: pour les méthodes, T: pour les types et N: pour les espaces de noms.
  • .ctor pour les constructeurs et .cctor pour les constructeurs statiques.

Exemples :

Valeur d’option Récapitulatif
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType Correspond à tous les symboles nommés MyType.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 Correspond à tous les symboles nommés MyType1 ou MyType2.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) Correspond à une méthode MyMethod spécifique avec la signature complète spécifiée.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) Correspond à des méthodes MyMethod1 et MyMethod2 spécifiques avec la signature complète spécifiée.

Exclure des types spécifiques et leurs types dérivés

Vous pouvez exclure de l’analyse des types spécifiques et leurs types dérivés. Par exemple, pour spécifier que la règle ne doit s’exécuter sur aucune méthode dans des types nommés MyType et leurs types dérivés, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

Formats de nom de symbole autorisés dans la valeur d’option (séparés par |) :

  • Nom du type uniquement (inclut tous les types avec le nom, quel que soit le type ou l’espace de noms qui les contient).
  • Noms qualifiés complets au format d’ID de documentation du symbole, avec un préfixe T: facultatif.

Exemples :

Valeur d’option Récapitulatif
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType Correspond à tous les types nommés MyType et à tous leurs types dérivés.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 Correspond à tous les types nommés MyType1 ou MyType2, et à tous leurs types dérivés.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType Correspond à un type MyType spécifique avec un nom complet donné et tous ses types dérivés.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 Correspond à des types MyType1 ou MyType2 spécifiques avec leur nom complet respectif et tous leurs types dérivés.

Voir aussi