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#)
Conceitos
Substituindo verificações de segurança
Independência da linguagem e componentes independentes da linguagem