CA2137 : Les méthodes transparentes doivent contenir uniquement des IL vérifiables

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

Cause

Une méthode contient du code non vérifiable ou retourne un type par référence.

Notes

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

Description de la règle

Cette règle se déclenche lorsque le code transparent de sécurité tente d’exécuter du code MSIL (Microsoft Intermediate Language) non vérifiable. Toutefois, la règle ne contient pas de vérificateur IL (Intermediate Language) complet, et à la place utilise l’heuristique pour intercepter la plupart des violations de vérification MSIL.

Pour être certain que votre code contient uniquement du code MSIL vérifiable, exécutez Peverify.exe (outil PEVerify) sur votre assembly. Exécutez PEVerify avec l’option /transparent qui limite la sortie aux seules méthodes transparentes non vérifiables susceptibles de provoquer une erreur. Si l’option /transparent n’est pas utilisée, PEVerify vérifie également les méthodes critiques qui sont autorisées à contenir du code non vérifiable.

Comment corriger les violations

Pour corriger une infraction à cette règle, marquez la méthode avec l’attribut SecurityCriticalAttribute ou SecuritySafeCriticalAttribute, ou supprimez le code non vérifiable.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

La méthode de cet exemple utilise du code non vérifiable et doit être marquée avec l’attribut SecurityCriticalAttribute ou SecuritySafeCriticalAttribute.

using System;
using System.Security;


namespace TransparencyWarningsDemo
{

    public class UnverifiableMethodClass
    {
        // CA2137 violation - transparent method with unverifiable code.  This method should become critical or
        // safe critical 
    //    public unsafe byte[] UnverifiableMethod(int length)
    //    {
    //        byte[] bytes = new byte[length];
    //        fixed (byte* pb = bytes)
    //        {
    //            *pb = (byte)length;
    //        }

    //        return bytes;
    //    }
    }

}