CA2102 : Interceptez les exceptions non CLSCompliant dans les gestionnaires généraux

Élément Valeur
ID de la règle CA2102
Category Microsoft.Security
Modification avec rupture Sans rupture

Cause

Un membre d’un assembly qui n’est pas marqué avec RuntimeCompatibilityAttribute ou qui est marqué RuntimeCompatibility(WrapNonExceptionThrows = false) contient un bloc catch qui gère System.Exception et ne contient pas un bloc catch général suivant immédiatement . Cette règle ignore les assemblys Visual Basic.

Notes

Cette règle est déconseillée. Pour plus d’informations, consultez Règles dépréciées.

Description de la règle

Un bloc catch qui gère Exception intercepte toutes les exceptions conformes CLS (Common Language Specification). Toutefois, elle n’intercepte pas les exceptions non conformes CLS. Les exceptions non conformes CLS peuvent être levées à partir du code natif ou du code managé généré par l’assembleur MSIL (Microsoft Intermediate Language). Notez que les compilateurs C# et Visual Basic n’autorisent pas les exceptions non conformes CLS à lever 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érale suivante.

  • C#: catch {}

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

Une exception non gérée non conforme CLS devient un problème de sécurité lorsque les autorisations précédemment autorisées sont supprimées dans le bloc catch. Étant donné que les exceptions non conformes CLS ne sont pas interceptées, une méthode malveillante qui lève une exception non conforme CLS peut s’exécuter avec des autorisations élevées.

Comment corriger les violations

Pour corriger une violation de cette règle lorsque l’intention consiste à intercepter toutes les exceptions, remplacez ou ajoutez un bloc catch général ou marquez l’assembly RuntimeCompatibility(WrapNonExceptionThrows = true). Si les autorisations sont supprimées dans le bloc catch, dupliquez les fonctionnalités du bloc catch général. S’il n’est pas l’intention de gérer toutes les exceptions, remplacez le bloc catch qui gère Exception par des blocs catch qui gèrent des types d’exceptions spécifiques.

Quand supprimer les avertissements

Il est sûr de supprimer un avertissement de cette règle si le bloc try ne contient aucune instruction susceptible de générer une exception non conforme CLS. Étant donné que tout code natif ou managé peut lever une exception non conforme CLS, cela nécessite une connaissance de tout le code qui peut être exécuté dans tous les chemins de code à l’intérieur du bloc try. Notez que les exceptions non conformes CLS ne sont pas levées par le Common Language Runtime.

Exemple 1

L’exemple suivant montre 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
   }
}

Exemple 2

L’exemple suivant montre une méthode qui contient 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

CA1031 : Ne pas intercepter des types d'exception générale

Voir aussi