Partilhar via


Visão Geral de supressão em código-fonte

Supressão de código-fonte é a capacidade de suprimir ou ignorar as violações de análise de código no código gerenciado, adicionando a SuppressMessage para os segmentos de código que causam violações de atributo. O SuppressMessage é um atributo condicional que está incluído nos metadados IL de seu conjunto de código gerenciado, somente se o símbolo de compilação de CODE_ANALYSIS é definido no momento da compilação.

No C++ gerenciado, use as macros CA_SUPPRESS_MESSAGE ou CA_GLOBAL_SUPPRESS_MESSAGE no arquivo de cabeçalho, adicionar o atributo.

Você não deve usar as supressões de código-fonte em compilações de versão para impedir que os metadados de supressão de código-fonte de remessa acidentalmente. Por causa do custo de processamento de supressão de código-fonte, o desempenho do seu aplicativo pode ser degradado, incluindo os metadados de supressão de código-fonte.

ObservaçãoObservação

Não é necessário para entregar código esses atributos você mesmo. Para obter mais informações, consulte Como: Suprimir Avisos usando o Item de Menu. O item de menu não está disponível para o código C++.

Atributo SuppressMessage

Quando você clica um aviso de análise de código no Error List e, em seguida, clique em Suprimir mensagem (NS), um SuppressMessage atributo é adicionado no seu código ou para o arquivo do projeto supressões global.

O SuppressMessage atributo tem o seguinte formato:

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

[C++]

CA_SUPPRESS_MESSAGE("Rule Category", "Rule Id", Justification = "Justification", MessageId = "MessageId", Scope = "Scope", Target = "Target")

Onde:

  • Categoria de regras -A categoria na qual a regra é definida. Para obter mais informações sobre categorias de regras de análise de código, consulte Análise de código para avisos do código gerenciado.

  • Identificação da regra -O identificador da regra. O suporte inclui tanto um nome curto e longo para o identificador de regra. O nome curto é CAXXXX; o nome longo é CAXXXX:FriendlyTypeName.

  • Justificativa -O texto que é usado para documentar o motivo para suprimir a mensagem.

  • Identificação da mensagem -identificador exclusivo de um problema para cada mensagem.

  • Escopo -O destino em que o aviso é suprimido. Se o destino não for especificado, ele é definido como o destino do atributo. Há suporte para os seguintes escopos:

    • Module

    • Namespace

    • Resource

    • Tipo

    • Membro

  • Destino - um identificador é usado para especificar o destino em que o aviso é suprimido. Ele deve conter um nome totalmente qualificado de item.

Uso de SuppressMessage

Avisos de análise de código são suprimidos no nível ao qual uma instância da SuppressMessage atributo é aplicado. O objetivo é acoplar rigidamente as informações de combate ao código onde ocorre a violação.

O formulário geral de supressão inclui a categoria de regra e um identificador de regra que contém uma representação opcional legível para o usuário do nome da regra. Por exemplo,

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

Se houver motivos de desempenho estrito para minimizar os metadados de supressão de código-fonte, o nome da regra pode ser deixado de. A categoria de regra e a sua ID de regra juntas constituem um identificador de regra suficientemente exclusiva. Por exemplo,

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

Esse formato não é recomendado devido a problemas de sustentabilidade.

Suprimindo Múltiplas Violações dentro de um corpo de método

Atributos só podem ser aplicados para um método e não podem ser incorporados dentro do corpo do método. No entanto, você pode especificar o identificador como a ID de mensagem para distinguir várias ocorrências de uma violação de um método.

Imports System

Namespace InSourceSuppression
    Public Class Class1

        <System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", _
        "CA1801:ReviewUnusedParameters", MessageId:="cmdArgs")> _
        Shared Sub Main(ByVal cmdArgs() As String)

        End Sub

        <System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", _
        "CA1806:DoNotIgnoreMethodResults", MessageId:="System.Guid")> _
        Shared Function IsValidGuid(ByVal g As String) As Boolean
            Try
                Dim instance As New Guid(g) 'Causes CA1806: DoNotIgnoreMethodResults
                Return True
            Catch e As ArgumentNullException
            Catch e As OverflowException
            Catch e As FormatException
            End Try

            Return False
        End Function
    End Class
End Namespace
using System;

namespace InSourceSuppression
{
    public class Class1
    {

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "args")]
        static void Main(string[] args) { }


        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
        "CA1806:DoNotIgnoreMethodResults", MessageId = "System.Guid")]
        public static bool IsValidGuid(string guid)
        {
            try
            {
              new Guid(guid); //Causes CA1806: DoNotIgnoreMethodResults
              return true;
            }
            catch (ArgumentNullException) {}
            catch (OverflowException) {}
            catch (FormatException) {}
            return false;
        }
   }
}
using namespace System;

CA_SUPPRESS_MESSAGE("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId="args")
int main(array<System::String ^> ^args)
{
    return 0;
}

namespace InSourceSuppression
{
public ref class Class1
{
public:
       CA_SUPPRESS_MESSAGE("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults", MessageId="System.Uri")
       static bool IsValidGuid(String^ uri)
       {
              try
              {
                     gcnew Uri(uri);
                     return true;
              }
              catch (ArgumentNullException^) {}
              catch (OverflowException^) {}
              catch (FormatException^) {}
              return false;
       }
};
}

Código gerado

Compiladores de código gerenciado e algumas ferramentas de terceiros geram código para facilitar o desenvolvimento de código rápida. Código gerado pelo compilador que aparece em arquivos de origem, geralmente é marcado com o GeneratedCodeAttribute atributo.

Você pode escolher se deseja suprimir avisos de análise de código e erros de código gerado. Para obter informações sobre como suprimir tais erros e avisos, consulte Como: Suprimir Avisos de análise de código para código gerado.

Observe que ignora a análise de código GeneratedCodeAttribute quando ela é aplicada a um assembly inteiro ou em um único parâmetro. Essas situações ocorrem raramente.

Supressões de nível global

A ferramenta de análise de código gerenciado examina atributos SuppressMessage que são aplicados no assembly, módulo, tipo, membro ou nível de parâmetro. Ele também aciona violações contra recursos e namespaces. Essas violações e devem ser aplicadas no nível global são escopo e direcionadas. Por exemplo, a seguinte mensagem suprime uma violação de namespace:

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

ObservaçãoObservação

Quando você suprime um aviso com escopo de namespace, ele suprime o aviso em relação ao namespace propriamente dito. Ele não suprime o aviso contra os tipos no namespace.

Qualquer supressão pode ser expressa especificando um escopo explícito. Esses supressões devem residir no nível global. É possível especificar supressão de nível de membro de um tipo de decoração.

Supressões de nível global são a única maneira de suprimir mensagens que se referem ao código gerado pelo compilador que não está mapeado para a origem de usuário fornecido explicitamente. Por exemplo, o código a seguir suprime uma violação contra um construtor emitido do compilador:

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

ObservaçãoObservação

Destino sempre contém o nome totalmente qualificado de item.

Arquivo de Supressão global

O arquivo de supressão global mantém supressões de supressões de nível global ou de supressões não especificam um destino. Por exemplo, as supressões de violações de nível de assembly são armazenadas neste arquivo. Além disso, algumas funções do ASP.NET supressões são armazenadas neste arquivo, porque as configurações de nível de projeto não estão disponíveis para o código por trás de um formulário. Uma supressão global é criada e adicionada ao seu projeto na primeira vez que você selecione o No arquivo de supressão de projeto a opção do Suprimir mensagem (NS) comando na janela Error List. Para obter mais informações, consulte Como: Suprimir Avisos usando o Item de Menu.

Consulte também

Referência

System.Diagnostics.CodeAnalysis