Partager via


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

TypeName

TransparentMethodsMustBeVerifiable

CheckId

CA2137

Catégorie

Microsoft.Security

Modification avec rupture

Oui

Cause

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

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 uniquement aux méthodes transparentes non vérifiables qui génèrent une erreur. Si l'option /transparent n'est pas utilisée, PEVerify vérifie également des méthodes critiques qui peuvent contenir le code non vérifiable.

Comment corriger les violations

Pour résoudre une violation de 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 employée dans cet exemple utilise un 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;
    //    }
    }

}