Partilhar via


CA2102: capturar exceções que não sejam CLSCompliant em manipuladores gerais

TypeName

CatchNonClsCompliantExceptionsInGeneralHandlers

CheckId

CA2102

Categoria

Microsoft.Security

Alteração Significativa

Sem quebra

Causa

Um membro em um assembly que não é marcado com RuntimeCompatibilityAttribute ou está marcado RuntimeCompatibility(WrapNonExceptionThrows = false) contém um bloco de captura que trata Exception e não contém imediatamente após um bloco geral de captura.Esta regra ignora os assemblies de Visual Basic .

Descrição da Regra

Um bloco de captura que trata captura de Exception todas as exceções de correspondência de CLS (CLS).No entanto, não capturar exceções de correspondência de non-CLS.As exceções correspondentes de Non-CLS podem ser geradas a partir do código nativo ou de código gerenciado que foi gerado por assembler de linguagem intermediária da Microsoft (MSIL).Observe que os compiladores C# e Visual Basic não permite que a non-CLS as exceções lançadas sejam compatíveis e Visual Basic não capturar exceções de correspondência de non-CLS.Se a intenção do bloco de captura é manipular todas as exceções, use a seguinte sintaxe geral do bloco de captura.

  • C#: catch {}

  • C++: catch(...) {} ou catch(Object^) {}

Uma exceção de correspondência de non-CLS sem-tratamento se torna um problema de segurança quando as permissões são permitidas previamente removidas no bloco de captura.Como as exceções de correspondência de non-CLS não são capturadas, um método mal-intencionado que jogasse uma exceção de correspondência de non-CLS pode executar com permissões elevadas.

Como Corrigir Violações

Para corrigir uma violação desta regra quando a intenção é capturar todas as exceções, substituir ou adicionar um bloco geral de captura ou marcar o assembly RuntimeCompatibility(WrapNonExceptionThrows = true).Se as permissões são removidas no bloco de captura, duplica a funcionalidade no bloco geral de captura.Se não for a intenção para manipular todas as exceções, substitua o bloco de captura que trata Exception com blocos de try/catch que manipulam exceção de tipos específicos.

Quando Suprimir Alertas

É seguro suprimir um aviso dessa regra se o bloco try não contém nenhuma instrução que podem gerar uma exceção de correspondência de non-CLS.Como todo o modo nativo ou código gerenciado podem gerar uma exceção de correspondência de non-CLS, isso requer o conhecimento de qualquer código que pode ser executado em todos os caminhos de código no bloco try.Observe que as exceções de correspondência de non-CLS não são lançadas por Common Language Runtime.

Exemplo

O exemplo a seguir mostra uma classe de MSIL que gerou uma exceção de correspondência de non-CLS.

.assembly ThrowNonClsCompliantException {}
.class public auto ansi beforefieldinit ThrowsExceptions
{
   .method public hidebysig static void
         ThrowNonClsException() cil managed
   {
      .maxstack  1
      IL_0000:  newobj     instance void [mscorlib]System.Object::.ctor()
      IL_0005:  throw
   }
}

O exemplo a seguir mostra um método que contém um bloco geral de captura que satisfaça a regra.

// CatchNonClsCompliantException.cs 
using System;

namespace SecurityLibrary
{
   class HandlesExceptions
   {
      void CatchAllExceptions()
      {
         try
         {
            ThrowsExceptions.ThrowNonClsException();
         }
         catch(Exception e)
         {
            // Remove some permission.
            Console.WriteLine("CLS compliant exception caught");
         }
         catch
         {
            // Remove the same permission as above.
            Console.WriteLine("Non-CLS compliant exception caught.");
         }
      }

      static void Main()
      {
         HandlesExceptions handleExceptions = new HandlesExceptions();
         handleExceptions.CatchAllExceptions();
      }
   }
}

Criar os exemplos anteriores da seguinte maneira.

ilasm /dll ThrowNonClsCompliantException.il
csc /r:ThrowNonClsCompliantException.dll CatchNonClsCompliantException.cs

Regras Relacionadas

CA1031: não capturar tipos de exceção gerais

Consulte também

Referência

Exceções e manipulação de exceções (Guia de Programação em C#)

Ilasm.exe (IL Assembler)

Conceitos

Substituindo verificações de segurança

Independência da linguagem e componentes independentes da linguagem