CA2102: Detectar las excepciones que no son CLSCompliant en los controladores generales
TypeName |
CatchNonClsCompliantExceptionsInGeneralHandlers |
Identificador de comprobación |
CA2102 |
Categoría |
Microsoft.Security |
Cambio problemático |
Poco problemático |
Motivo
Un miembro de un ensamblado que no está marcado con RuntimeCompatibilityAttribute o está marcado con RuntimeCompatibility(WrapNonExceptionThrows = false) contiene un bloque catch que controla Exception y no contiene un bloque catch general inmediatamente a continuación.Esta regla omite los ensamblados de Visual Basic.
Descripción de la regla
Un bloque catch que controla Exception detecta todas las excepciones conformes a Common Language Specification (CLS).Sin embargo, no detecta las excepciones no conformes a CLS.Las excepciones no conformes a CLS pueden iniciarse desde código nativo o código administrado generado por el ensamblador del Lenguaje Intermedio de Microsoft (MSIL).Observe que los compiladores de Visual Basic y C# no permiten producir excepciones no conformes a CLS, y que Visual Basic no detecta excepciones no conformes a CLS.Si la intención del bloque catch es controlar todas las excepciones, utilice la siguiente sintaxis de bloque catch general.
C#: catch {}
C++: catch(...) {} o catch(Object^) {}
Una excepción no conforme a CLS que no se controla se convierte en un problema de seguridad cuando en el bloque catch se quitan los permisos anteriormente concedidos.Dado que no se detectan excepciones no conformes a CLS, un método malintencionado que produzca una excepción no conforme a CLS se podría ejecutar con permisos elevados.
Cómo corregir infracciones
Para corregir una infracción de esta regla cuando la intención es detectar todas las excepciones, sustituya o agregue un bloque catch general o marque el ensamblado con RuntimeCompatibility(WrapNonExceptionThrows = true).Si se quitan los permisos en el bloque catch, duplique la funcionalidad en el bloque catch general.Si la intención no es controlar todas las excepciones, reemplace el bloque catch que controle Exception con bloques catch que controlen tipos de excepción específicos.
Cuándo suprimir advertencias
Se puede suprimir de forma segura una advertencia de esta regla si el bloque try no contiene ninguna instrucción que pueda generar una excepción no conforme a CLS.Dado que cualquier código nativo o administrado podría iniciar una excepción no conforme a CLS, es necesario conocer todos los códigos que se pueden ejecutar en todas las rutas de código dentro del bloque de try.Observe que Common Language Runtime no inicia excepciones no conformes a CLS.
Ejemplo
En el ejemplo siguiente se muestra una clase MSIL que inicia una excepción no conforme a 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
}
}
En el ejemplo siguiente se muestra un método que contiene un bloque catch general que cumple la regla.
// 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();
}
}
}
Compile los ejemplos anteriores de la manera siguiente.
ilasm /dll ThrowNonClsCompliantException.il
csc /r:ThrowNonClsCompliantException.dll CatchNonClsCompliantException.cs
Reglas relacionadas
CA1031: No capturar los tipos de excepción general
Vea también
Referencia
Excepciones y control de excepciones (Guía de programación de C#)
Conceptos
Invalidar comprobaciones de seguridad
Independencia del lenguaje y componentes independientes del lenguaje