Partager via


CA2139 : Les méthodes transparentes ne peuvent pas utiliser l'attribut HandleProcessCorruptingExceptions

TypeName

TransparentMethodsMustNotHandleProcessCorruptingExceptions

CheckId

CA2139

Catégorie

Microsoft.Security

Modification avec rupture

Oui

Cause

Une méthode transparente est marquée avec l'attribut HandleProcessCorruptedStateExceptionsAttribute.

Description de la règle

Cette règle déclenche toute méthode transparente et essaie de gérer une exception qui endommage un processus à l'aide de l'attribut HandleProcessCorruptedStateExceptionsAttribute. Une exception qui endommage un processus est une classification d'exception CLR version 4.0 des exceptions tel AccessViolationException. L'attribut HandleProcessCorruptedStateExceptionsAttribute peut uniquement être utilisé par des méthodes critiques de sécurité et sera ignoré s'il s'applique à une méthode transparente. Pour gérer les exceptions qui endommagent un processus, cette méthode doit devenir critique de sécurité (security-critical) ou critique sécurisée (security-safe-critical).

Comment corriger les violations

Pour résoudre une violation de cette règle, supprimez l'attribut HandleProcessCorruptedStateExceptionsAttribute ou marquez la méthode avec l'attribut SecurityCriticalAttribute ou SecuritySafeCriticalAttribute.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

Dans cet exemple, une méthode transparente est marquée avec l'attribut HandleProcessCorruptedStateExceptionsAttribute et échouera la règle. La méthode doit également être marquée avec l'attribut SecurityCriticalAttribute ou SecuritySafeCriticalAttribute.

using System;
using System.Runtime.InteropServices;
using System.Runtime.ExceptionServices;
using System.Security;

namespace TransparencyWarningsDemo
{

    public class HandleProcessCorruptedStateExceptionClass
    {
        [DllImport("SomeModule.dll")]
        private static extern void NativeCode();

        // CA2139 violation - transparent method attempting to handle a process corrupting exception
        [HandleProcessCorruptedStateExceptions]
        public void HandleCorruptingExceptions()
        {
            try
            {
                NativeCode();
            }
            catch (AccessViolationException) { }
        }
    }

}