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 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#)
Concetti
Override dei controlli di sicurezza
Indipendenza del linguaggio e componenti indipendenti dal linguaggio