Supprimer les violations de l’analyse du code

Si vous collaborez avec votre équipe lorsque vous créez du code, il est souvent utile d'indiquer qu'un avertissement n'est pas applicable. La suppression des violations d'analyse de code indique aux membres de l'équipe que le code a été examiné, et que l'avertissement peut être supprimé. Les sections suivantes décrivent les différentes façons de supprimer les violations d’analyse du code à l’aide de l’environnement IDE Visual Studio.

Suppression des violations à l’aide du fichier EditorConfig

Dans le fichier EditorConfig de votre solution ou projet, ajoutez une entrée pour chaque règle que vous souhaitez configurer et définissez sa gravité sur none. Par exemple : dotnet_diagnostic.CA1822.severity = none. Pour plus d'informations, consultez Configurer manuellement la gravité des règles dans un fichier EditorConfig. Pour ajouter un fichier EditorConfig, consultez Ajout d’un fichier EditorConfig à un projet.

Suppression des violations dans le code source

Vous pouvez supprimer les violations dans votre code source à l'aide d'une directive de préprocesseur, qui supprime les violations pour une ligne de code spécifique :

Vous pouvez également utiliser l'attribut SuppressMessageAttribute pour supprimer un avertissement dans votre code C# et Visual Basic.

Suppression des violations à l'aide de l'éditeur de code

Pour supprimer les violations à l'aide de l'éditeur de code, procédez comme suit :

  1. Placez le curseur sur la ligne de code présentant la violation et appuyez sur Ctrl+Point (.) ou Alt+Entrée pour ouvrir le menu Actions rapides.

  2. Sélectionnez Supprimer ou configurer les problèmes><Numéro de la règle de suppression>, puis choisissez dans la source ou dans la source (attribut).

    • Si vous choisissez dans la source, vous voyez un aperçu de la directive de préprocesseur ajoutée à votre code.

      Capture d'écran montrant la sélection dans la source depuis le menu Suppression des actions rapides.

    • Si vous choisissez dans la source (attribut), vous voyez un aperçu de l'attribut SuppressMessage ajouté à votre code.

      Capture d'écran montrant la sélection source (attribut) dans le menu Suppression des actions rapides.

Supprimer les violations à l'aide de la liste d'erreurs

Pour supprimer les violations à l'aide de la fenêtre Liste d'erreurs, procédez comme suit :

  1. Dans la fenêtre Liste d'erreurs, sélectionnez les règles à supprimer.

  2. Cliquez avec le bouton droit, puis sélectionnez Supprimer>dans la source.

    La boîte de dialogue Aperçu des modifications s'ouvre et affiche un aperçu de la directive d'avertissement #pragma C# ou de la directive d'avertissement #Disable Visual Basic ajoutée au code source.

    Capture d'écran montrant la boîte de dialogue Aperçu des modifications pour ajouter des avertissements #pragma dans le fichier de code.

  3. Sélectionnez Appliquer pour enregistrer les modifications dans votre fichier de code.

Exclure les diagnostics de génération de la liste d'erreurs

Si vous ne voyez pas l'option de menu Supprimer dans la fenêtre Liste d'erreurs, la violation provient probablement d'une analyse en cours de construction et non d'une analyse en direct. La fenêtre Liste d'erreurs affiche les diagnostics, ou les violations de règles, provenant à la fois de l'analyse de code en direct et des compilations. Étant donné que les diagnostics de compilation peuvent être périmés, par exemple si vous avez modifié le code pour corriger la violation mais que vous ne l'avez pas regénéré, vous ne pouvez pas toujours supprimer ces diagnostics de la liste d'erreurs.

Les diagnostics issus de l'analyse en direct, ou IntelliSense, sont toujours à jour avec les sources actuelles et peuvent toujours être supprimés de la liste d'erreurs. Pour exclure les diagnostics de génération de votre sélection, procédez comme suit :

  1. Dans la liste déroulante filtre source liste d'erreurs, remplacez la sélection de Build + IntelliSense par IntelliSense uniquement.

    Capture d'écran montrant le filtre source de la liste d'erreurs.

  2. Sélectionnez les diagnostics que vous souhaitez supprimer et continuez comme indiqué précédemment.

Suppression des violations à l’aide d’un fichier de suppression global

Le fichier de suppression global utilise l'attribut SuppressMessageAttribute pour supprimer les violations de code.

Utiliser un fichier de suppression global de l'éditeur de code

Pour supprimer des violations à l'aide d'un fichier de suppression global en utilisant l'éditeur de code, procédez comme suit :

  1. Dans l'éditeur de code, placez le curseur sur une ligne de code comportant une violation et appuyez sur Ctrl+Point (.) ou Alt+Enter pour ouvrir le menu Actions rapides.

  2. Sélectionnez Suppression du <numéro de règle>, puis choisissez dans le fichier de suppression.

    Visual Studio crée un onglet dans l'éditeur de code contenant le nouveau fichier de suppression global.

Utiliser un fichier de suppression global de la liste d'erreurs

Pour supprimer les violations avec un fichier de suppression global à l'aide de la fenêtre Liste d'erreurs, procédez comme suit :

  1. Dans la fenêtre Liste d'erreurs, sélectionnez les règles à supprimer.

  2. Cliquez avec le bouton droit, puis sélectionnez Supprimer>dans le fichier de suppression.

    La boîte de dialogue Aperçu des modifications s'ouvre et affiche un aperçu de l'attribut SuppressMessageAttribute ajouté au fichier de suppression globale.

    Capture d'écran montrant la boîte de dialogue Aperçu des modifications avec un attribut SuppressMessageAttribute dans le fichier de suppression.

  3. Sélectionnez Appliquer pour enregistrer le fichier de suppression globale.

Supprimer toutes les violations actuelles

La suppression de toutes les violations actuelles est parfois appelée baselining. Pour supprimer toutes les violations actuelles dans une solution ou un projet, procédez comme suit :

  1. Dans la barre des menus de Visual Studio, sélectionnez Analyser>Générer et supprimer les problèmes actifs.

  2. Sélectionnez Pour que la solution supprime les violations pour l'ensemble de la solution, ou sélectionnez Pour le <nom du projet> afin de supprimer les violations pour votre projet uniquement.

Suppression des violations à l’aide des paramètres du projet

Pour supprimer les violations à l'aide de Explorateur de solutions paramètres de projet, procédez comme suit :

  1. Dans l'Explorateur de solutions, sélectionnez votre projet.

  2. Cliquez avec le bouton droit, puis sélectionnez Propriétés (ou appuyez sur Alt + Entrée).

  3. Dans la fenêtre Propriétés, sélectionnez Analyse de code dans le volet gauche, puis désactivez Supprimer les résultats du code généré.

Suppression des violations à l’aide d’un ensemble de règles

Dans l'éditeur d'ensemble de règles, décochez la case en face de son nom ou définissez Action sur Aucun.

Suppression in-source et l'attribut SuppressMessageAttribute

La suppression in-source (ISS) utilise l’attribut SuppressMessageAttribute pour supprimer un avertissement. Vous pouvez ajouter l'attribut SuppressMessageAttribute au fichier source près du segment de code qui a généré l'avertissement.

Vous pouvez entrer l'attribut manuellement dans l'éditeur de code ou ajouter automatiquement l'attribut comme suit :

  1. Dans l'éditeur de code, placez le curseur sur une ligne de code comportant une violation et appuyez sur Ctrl+Point (.) ou Alt+Enter pour ouvrir le menu Actions rapides.

  2. Sélectionnez Supprimer ou configurer les problèmes>Supprimer <le numéro de la règle> dans le menu Actions rapides.

  3. Effectuez l’une des étapes suivantes :

    • Sélectionnez dans la source (attribut).

      Visual Studio ajoute un attribut SuppressMessageAttribute à votre code.

    • Sélectionnez dans le fichier de suppression.

      Visual Studio crée un onglet dans l'éditeur de code contenant un nouveau fichier de suppression global avec des attributs SuppressMessageAttribute.

L'attribut SuppressMessageAttribute est un attribut conditionnel, qui n'est inclus dans les métadonnées de votre assembly de code managé. Cet attribut n'est inclus que si le symbole de compilation CODE_ANALYSIS est défini au moment de la compilation.

Dans le code C++ et CLI uniquement, utilisez les macros CA_SUPPRESS_MESSAGE ou CA_GLOBAL_SUPPRESS_MESSAGE dans le fichier d'en-tête pour ajouter l'attribut.

Si vous migrez un projet vers la dernière version de Visual Studio, vous risquez de voir apparaître un grand nombre d'avertissements relatifs à l'analyse de code. Si vous n’avez pas la possibilité de corriger les avertissements, vous pouvez tous les supprimer en sélectionnant Analyser>Générer et supprimer les problèmes actifs.

Remarque

N'utilisez pas les suppressions in-source sur les versions de compilation, afin d'éviter d'envoyer accidentellement les métadonnées de suppression in-source.

Format d'attribut SuppressMessageAttribute

L’attribut SuppressMessageAttribute présente le format suivant :

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

Les propriétés de l’attribut sont les suivantes :

  • Category : la catégorie de la règle. Pour plus d'informations sur les catégories de règles d'analyse de code, consultez Règles de qualité du code.

  • CheckId: L'identifiant de la règle. Sont pris en charge à la fois un nom court Le nom court est CAXXXX; et le nom long est CAXXXX:FriendlyTypeName.

  • Justification : le texte utilisé pour documenter la raison de la suppression du message.

  • MessageId : l'identificateur unique du problème pour chaque message.

  • Scope : la cible sur laquelle l'avertissement est supprimé. Si la cible n'est pas spécifiée, le système la fixe à la cible de l'attribut. Les valeurs prises en charge pour Scope sont les suivantes :

    • module : Cet étendue supprime les avertissements concernant un assembly. Il s'agit d'une suppression globale qui s'applique à l'ensemble du projet.

    • resource : (FxCop hérité uniquement) Cet étendue supprime les avertissements dans les informations de diagnostic écrites dans les fichiers de ressources qui font partie du module (assembly). Cette étendue n'est pas lue ni respectée dans les compilateurs C# et Visual Basic pour les diagnostics de l'analyseur Roslyn, qui n'analysent que les fichiers sources.

    • type : cet étendue supprime les avertissements concernant un type.

    • member : cet étendue supprime les avertissements concernant un membre.

    • namespace : cette étendue supprime les avertissements concernant l'espace de noms proprement dit. Il ne supprime pas les avertissements concernant les types à l'intérieur de l'espace de noms.

    • namespaceanddescendants : (version 3.x ou ultérieure du compilateur et Visual Studio 2019 requis) Cet étendue supprime les avertissements dans un espace de noms et tous les symboles qui en découlent. L'analyse héritée ignore la valeur namespaceanddescendants.

  • Target : un identifiant qui spécifie la cible sur laquelle l'avertissement est supprimé. Il doit contenir un nom de composant complet.

Lorsque vous voyez des avertissements dans Visual Studio, vous pouvez afficher des exemples de SuppressMessageAttribute en ajoutant une suppression au fichier de suppression global. L’attribut de suppression et ses propriétés requises s’affichent dans une fenêtre d’aperçu.

Utilisation de SuppressMessageAttribute

Les avertissements de l'analyse de code sont supprimés au niveau auquel l'attribut SuppressMessageAttribute est appliqué. Par exemple, cet attribut peut intervenir au niveau de l’assembly, du module, du type, du membre ou du paramètre. Son objectif consiste à coupler étroitement les informations de suppression au code dans lequel la violation se produit.

La forme générale de suppression inclut la catégorie de la règle et un identificateur de règle, qui contient éventuellement une représentation lisible par l’homme du nom de la règle. Par exemple :

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

Si la réduction des métadonnées de suppression in-source est strictement motivée par des raisons de performance, le nom de la règle peut être omis. La catégorie de la règle et son ID forment ensemble un identificateur de règle suffisamment unique. Par exemple :

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

Pour des raisons de maintenance, il n'est pas recommandé d'omettre le nom de la règle.

Suppression des violations sélectives dans un corps de méthode

Les attributs de suppression peuvent être appliqués à une méthode, mais non incorporés dans un corps de méthode. Toutes les violations d’une règle particulière sont supprimées si l’attribut SuppressMessageAttribute est ajouté à la méthode.

Il est dans certains cas nécessaire de supprimer une instance particulière de la violation. Prenons l'exemple d'un code à venir qui n'est pas automatiquement exempté de la règle d'analyse de code. Certaines règles d’analyse du code vous permettent de supprimer une instance spécifique de la violation à l’aide de la propriété MessageId de l’attribut SuppressMessageAttribute. En général, les règles héritées pour les violations sur un symbole en particulier (une variable ou un paramètre local) respectent la propriété MessageId. CA1500:VariableNamesShouldNotMatchFieldNames en constitue un exemple. Toutefois, les règles héritées pour les violations sur le code exécutable (en dehors des symboles) ne respectent pas la propriété MessageId. De plus, les analyseurs .NET Compiler Platform (Roslyn) ne respectent pas la propriété MessageId.

Pour supprimer une violation de symbole particulière d’une règle, spécifiez le nom du symbole pour la propriété MessageId de l’attribut SuppressMessageAttribute. L'exemple suivant montre le code avec deux violations de CA1500:VariableNamesShouldNotMatchFieldNames : l'une pour la variable name, l'autre pour la variable age. Seule la violation du symbole age est supprimée.

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}");
    }
}

Suppressions de niveau global

L'outil d'analyse de code managé examine les attributs SuppressMessageAttribute qui sont appliqués au niveau de l'assembly, du module, du type, du membre ou du paramètre. Il soumet également des violations concernant les ressources et les espaces de noms. Ces violations, qui doivent intervenir au niveau global, sont circonscrites et ciblées. Par exemple, le message suivant supprime une violation d’espace de noms :

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

Pour les suppressions de niveau global :

  • Supprimer un avertissement avec une étendue namespace a pour effet de supprimer l'avertissement concernant l'espace de noms proprement dit. mais non l'avertissement concernant les types inclus dans l'espace de noms.

  • Target contient toujours le nom complet de l’élément.

  • Toutes les suppressions peuvent être exprimées en spécifiant une étendue explicite. Elles doivent s’effectuer au niveau global. Il n'est pas possible de spécifier la suppression au niveau des membres en modifiant un type.

  • Les suppressions de niveau global constituent le seul moyen de supprimer les messages faisant référence au code généré par le compilateur qui ne correspond pas à la source utilisateur fournie explicitement. Par exemple, le code suivant supprime une violation concernant un constructeur émis par le compilateur :

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

Fichier de suppression global

Le fichier de suppression global gère les suppressions qui constituent soit des suppressions de niveau global, soit des suppressions sans cible spécifiée. Par exemple, les suppressions de violations au niveau de l’assembly sont stockées dans ce fichier. Certaines suppressions ASP.NET y sont également stockées, car les paramètres au niveau du projet ne sont pas disponibles pour le code qui se trouve derrière un formulaire. Visual Studio crée et ajoute un fichier de suppression global à votre projet la première fois que vous sélectionnez l'option Fichier de suppression dans le projet de la commande Suppression dans la fenêtre Liste d'erreurs.

Étendue de suppression module

Pour supprimer les violations de la qualité du code pour l'ensemble de l'assembly, vous pouvez utiliser l'étendue module.

Par exemple, l'attribut suivant, spécifié dans le fichier projet GlobalSuppressions, a pour effet de supprimer la violation ConfigureAwait d'un projet ASP.NET Core :

[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")]

Code généré

Les compilateurs de code managé et certains outils externes génèrent du code pour faciliter et accélérer le développement. Le code généré par le compilateur qui apparaît dans les fichiers sources est marqué de l’attribut GeneratedCodeAttribute.

Pour l'analyse de code source, vous pouvez supprimer les messages dans le code généré dans un fichier .editorconfig. Pour plus d’informations, consultez Exclusion du code généré.

Pour l’analyse du code hérité, vous pouvez choisir de supprimer les avertissements et les erreurs d’analyse du code généré. Pour plus d'informations sur la manière de supprimer ces avertissements et ces erreurs, consultez Supprimer les avertissements d'analyse de code pour le code généré.

Remarque

L’analyse du code ignore GeneratedCodeAttribute lorsqu’elle est appliquée à un assembly entier ou à un paramètre unique.