CA2102 : Interceptez les exceptions non CLSCompliant dans les gestionnaires généraux
TypeName |
CatchNonClsCompliantExceptionsInGeneralHandlers |
CheckId |
CA2102 |
Catégorie |
Microsoft.Security |
Modification avec rupture |
Modification sans rupture |
Cause
Un membre dans un assembly qui n'est pas marqué avec le RuntimeCompatibilityAttribute ou qui est marqué avec RuntimeCompatibility(WrapNonExceptionThrows = false) contient un bloc catch qui gère System.Exception et ne contient pas de bloc catch général immédiatement après. Cette règle ignore les assemblys de Visual Basic.
Description de la règle
Un bloc catch qui gère Exception intercepte toutes les exceptions conformes CLS (Common Language Specification). Toutefois, il n'intercepte pas d'exceptions non conformes CLS. Les exceptions non conformes CLS peuvent être levées à partir du code natif ou du code managé qui était généré par l'Assembleur MSIL (Microsoft Intermediate Language). Notez que les compilateurs de C# et Visual Basic ne permettent pas de lever des exceptions non conformes à CLS et Visual Basic n'intercepte pas les exceptions non conformes à CLS. Si l'intention du bloc catch est de gérer toutes les exceptions, utilisez la syntaxe de bloc catch général suivante.
C#: catch {}
C++: catch(...) {} ou catch(Object^) {}
Une exception non conforme CLS et non gérée devient un problème de sécurité lorsque les autorisations octroyées précédemment sont supprimées dans le bloc catch. Comme les exceptions non conformes à CLS ne sont pas interceptées, une méthode malveillante qui lève une exception non conforme à CLS pourrait être exécutée avec des autorisations élevées.
Comment corriger les violations
Pour résoudre une violation de cette règle lorsque l'intention est d'intercepter toutes les exceptions, remplacez ou ajoutez un bloc catch général ou marquez l'assembly avec RuntimeCompatibility(WrapNonExceptionThrows = true). Si les autorisations sont supprimées du bloc catch, dupliquez les fonctionnalités dans le bloc catch général. Si l'intention n'est pas de gérer toutes les exceptions, remplacez le bloc catch qui gère Exception par les blocs catch qui gèrent des types d'exceptions spécifiques.
Quand supprimer les avertissements
Il est possible de supprimer sans risque un avertissement de cette règle si le bloc try ne contient pas d'instructions susceptibles de générer une exception non conforme CLS. Dans la mesure où un code managé ou natif peut lever une exception non conforme CLS, une connaissance de tous les codes qui peuvent être exécutés dans tous les chemins d'accès de code à l'intérieur du bloc try est requise. Notez que les exceptions non conformes CLS ne sont pas levées par le Common Language Runtime.
Exemple
L'exemple suivant présente une classe MSIL qui lève une exception non conforme 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
}
}
L'exemple suivant présente une méthode contenant un bloc catch général qui satisfait la règle.
// 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();
}
}
}
Compilez les exemples précédents comme suit.
ilasm /dll ThrowNonClsCompliantException.il
csc /r:ThrowNonClsCompliantException.dll CatchNonClsCompliantException.cs
Règles connexes
CA1031 : Ne pas intercepter des types d'exception générale
Voir aussi
Référence
Exceptions et gestion des exceptions (Guide de programmation C#)