Compartir a través de


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#)

Ilasm.exe (Ensamblador de IL)

Conceptos

Invalidar comprobaciones de seguridad

Independencia del lenguaje y componentes independientes del lenguaje