CA2102: Detectar las excepciones que no son CLSCompliant en los controladores generales

Elemento Valor
RuleId CA2102
Category Microsoft.Security
Cambio importante Poco problemático

Causa

Un miembro de un ensamblado que no está marcado con el RuntimeCompatibilityAttribute o está marcado como RuntimeCompatibility(WrapNonExceptionThrows = false) contiene un bloque catch que controla System.Exception y no contiene un bloque catch general inmediatamente siguiente. Esta regla omite los ensamblados de Visual Basic.

Nota

Esta regla está en desuso. Para más información, consulte Reglas en desuso.

Descripción de la regla

Un bloque catch manipulador Exception detecta todas las excepciones compatibles con Common Language Specification (CLS). Sin embargo, no detecta excepciones no compatibles con CLS. Las excepciones no compatibles con CLS se pueden producir desde código nativo o desde código administrado generado por el ensamblador de lenguaje intermedio de Microsoft (MSIL). Tenga en cuenta que los compiladores de C# y Visual Basic no permiten que se inicien excepciones no compatibles con CLS y que Visual Basic no detecta excepciones no compatibles con CLS. Si la intención del bloque catch es manejar todas las excepciones, use la siguiente sintaxis de bloque catch general.

  • C#: catch {}

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

Una excepción no controlada no compatible con CLS se convierte en un problema de seguridad cuando los permisos permitidos previamente se quitan en el bloque catch. Dado que no se detectan excepciones compatibles con CLS, un método malintencionado que inicia una excepción no conforme a CLS podría ejecutarse 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 RuntimeCompatibility(WrapNonExceptionThrows = true). Si los permisos se quitan 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 controla Exception por bloques catch que controlen tipos de excepciones específicos.

Cuándo suprimir las advertencias

Es seguro suprimir una advertencia de esta regla si el bloque try no contiene ninguna instrucción que pueda generar una excepción no compatible con CLS. Dado que cualquier código nativo o administrado podría producir una excepción no compatible con CLS, esto requiere conocimiento de todo el código que se puede ejecutar en todas las rutas de acceso de código dentro del bloque try. Tenga en cuenta que las excepciones no compatibles con CLS no se inician mediante Common Language Runtime.

Ejemplo 1

En el ejemplo siguiente se muestra una clase MSIL que produce una excepción no compatible con 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
   }
}

Ejemplo 2

En el ejemplo siguiente se muestra un método que contiene un bloque catch general que satisface 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 como se indica a continuación.

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

CA1031: No capturar los tipos de excepción general

Consulte también