Condividi tramite


CA2102: Individuare le eccezioni non conformi a CLS nei gestori generali

TypeName

CatchNonClsCompliantExceptionsInGeneralHandlers

CheckId

CA2102

Category

Microsoft.Security

Breaking Change

Non sostanziale

Causa

Un membro in un assembly che non è contrassegnato con l'attributo RuntimeCompatibilityAttribute o che è contrassegnato con RuntimeCompatibility(WrapNonExceptionThrows = false) contiene un blocco catch che gestisce System.Exception e non contiene un blocco catch generale immediatamente successivo. Questa regola ignora gli assembly Visual Basic.

Descrizione della regola

Un blocco catch che gestisce Exception rileva tutte le eccezioni conformi a CLS (Common Language Specification). Non rileva invece le eccezioni non conformi a CLS. Le eccezioni non conformi a CLS possono essere generate da codice nativo o da codice gestito generato dall'assembler Microsoft Intermediate Language (MSIL). Si noti che i compilatori C# e Visual Basic non consentono la generazione di eccezioni non conformi a CLS e che in Visual Basic tali eccezioni non vengono rilevate. Se lo scopo del blocco catch è la gestione di tutte le eccezioni, utilizzare la seguente sintassi del blocco catch generale.

  • C#: catch {}

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

Un'eccezione non conforme a CLS non gestita diviene un problema di sicurezza quando dal blocco catch vengono rimosse autorizzazioni concesse in precedenza. Poiché le eccezioni non conformi a CLS non vengono intercettate, potrebbe essere eseguito un metodo dannoso che genera un'eccezione non conforme a CLS con autorizzazioni elevate.

Come correggere le violazioni

Per correggere una violazione di questa regola quando lo scopo è intercettare tutte le eccezioni, sostituire o aggiungere un blocco catch generale o contrassegnare l'assembly RuntimeCompatibility(WrapNonExceptionThrows = true). Se le autorizzazioni vengono rimosse dal blocco catch, duplicare la funzionalità nel blocco catch generale. Se non si intende gestire tutte le eccezioni, sostituire il blocco catch che gestisce Exception con blocchi catch che gestiscono i tipi di eccezione specifici.

Esclusione di avvisi

L'esclusione di un avviso da questa regola è sicura se il blocco try non contiene istruzioni che potrebbero generare un'eccezione non conforme a CLS. Poiché il codice nativo o codice gestito potrebbe generare un'eccezione non conforme a CLS, tale scenario richiede la conoscenza di tutto il codice che può essere eseguito in tutti i percorsi di codice all'interno del blocco try. Si noti che le eccezioni non conformi a CLS non vengono generate da Common Language Runtime.

Esempio

Nell'esempio riportato di seguito è illustrata una classe MSIL che genera un'eccezione non 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
   }
}

Nell'esempio riportato di seguito è illustrato un metodo che contiene un blocco catch generale che soddisfà la regola.

// 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();
      }
   }
}

Compilare gli esempi precedenti come segue.

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

Regole correlate

CA1031: Non rilevare tipi di eccezione generali

Vedere anche

Riferimenti

Eccezioni e gestione delle eccezioni (Guida per programmatori C#)

Ilasm.exe (assembler MSIL)

Concetti

Override dei controlli di sicurezza

Common Language Specification