Partilhar via


Visão geral de supressão na origem

a exclusão em origem é a capacidade de suprimir ou ignorar violações de análise de código em código gerenciado adicionando o atributo de SuppressMessage aos segmentos de código que fazem com que as violações.O atributo é um atributo de SuppressMessage condicional que está incluído nos metadados de IL de seu assembly de código gerenciado apenas se o símbolo de compilação de CODE_ANALYSIS é definido em tempo de compilação.

Em C++/CLI, use as macros CA_SUPPRESS_MESSAGE ou CA_GLOBAL_SUPPRESS_MESSAGE no arquivo de cabeçalho, adicione o atributo.

Você não deve usar exclusões em origem em construções de versão para evitar enviar os metadados de exclusão em origem acidentalmente.Devido à despesa o custo de processamento de exclusão em origem, o desempenho de seu aplicativo também pode ser desatualizado incluindo os metadados de exclusão em origem.

ObservaçãoObservação

Você não precisa fornecer o 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 estará disponível para o código C++.

Atributo de SuppressMessage

Quando você clica com o botão direito do mouse em um aviso de análise de código em Lista de Erros e clique em Suprimir Mensagem, um atributo de SuppressMessage é adicionado ou em seu código ou ao projeto exclusões globais arquivo.

O atributo de SuppressMessage 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")

Where:

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

  • Use a ID - O identificador da regra.O suporte inclui um nome curto e longo para o identificador da regra.O nome curto é CAXXXX; o nome longo é CAXXXX:FriendlyTypeName.

  • Justificação - O texto usado para documentar a razão para suprimir a mensagem.

  • ID de mensagem - Identificador exclusivo de um problema para cada mensagem.

  • Escopo - O destino em que o aviso está sendo suprimido.Se o destino não for especificado, será definido como o destino do atributo.Os escopos com suporte incluem o seguinte:

    • Module

    • Namespace

    • Recurso

    • Tipo

    • Membro

  • Destino - Um identificador que é usado para especificar o destino em que o aviso está sendo suprimido.Deve conter um nome totalmente qualificada do item.

Uso de SuppressMessage

Os avisos da análise do código são suprimidos no nível a que uma instância do atributo de SuppressMessage é aplicada.O objetivo dessa é acoplar com segurança informações de exclusão ao código onde a violação ocorrer.

O formato geral de exclusão inclui a categoria de regra e um identificador da regra que contém uma representação legível opcional do nome da regra.Por exemplo,

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

Se houver motivo de desempenho restringidas para minimizar metadados de exclusão em origem, o próprio nome da regra pode ficar fora.A categoria de regra e o ID da regra suficientemente juntos constituem um identificador exclusivo da regra.Por exemplo,

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

Esse formato não é recomendada devido a problemas de manutenibilidade.

Suprimindo mais violações em um corpo do método

Os atributos só podem ser se aplicados a um método e não podem ser inseridas no 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 dentro 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

Os compiladores de código gerenciado e algumas ferramentas de terceiros gerenciem o código para facilitar o desenvolvimento rápido de código.o código gerado completo que aparecem nos arquivos de origem é marcado normalmente com o atributo de GeneratedCodeAttribute .

Você pode escolher se deseja suprimir avisos e erros de análise de código para o código gerado.Para obter informações sobre como suprimir esses avisos e erros, consulte Como suprimir avisos de análise do código para código gerenciado.

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

Exclusões de Global- nível

A ferramenta análise de código gerenciado examina os atributos de SuppressMessage que são aplicados ao assembly, módulo, tipo, membro ou nível do parâmetro.Também será acionado violações em recursos e namespaces.Essas violações devem ser aplicadas no nível global e têm escopo e pretendido.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 do namespace, suprime o aviso no namespace próprio.Não suprime o aviso em tipos no namespace.

Qualquer exclusão pode ser expressada especificando um escopo explícito.Essas exclusões devem viver no nível global.Você não pode especificar a exclusão de membros de nível decorando um tipo.

Exclusões de Global- nível é a única maneira de suprimir as mensagens que fazem referência ao código gerado completo que não é mapeado para a origem explicitamente fornecidas do usuário.Por exemplo, o seguinte código suprime uma violação em um construtor completo emissor:

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

ObservaçãoObservação

O destino sempre contém o nome totalmente qualificada do item.

Excluir Arquivo global

O arquivo global de exclusão mantém as exclusões que são exclusões de global- nível ou exclusões que não especificam um destino.Por exemplo, as exclusões para violações no nível de assembly são armazenadas no arquivo.Além disso, algumas exclusões do ASP.NET são armazenadas no arquivo como as configurações de nível de projeto não estão disponíveis para o código atrás de um formulário.Uma exclusão global é criada e adicionada a seu projeto na primeira vez que você seleciona a opção de Na exclusão Arquivo de projeto de comando de Suprimir Mensagem na janela da Lista de erros.Para obter mais informações, consulte Como suprimir avisos usando o item de menu.

Consulte também

Referência

System.Diagnostics.CodeAnalysis