Compartir a través de


CA2139: Los métodos transparentes no pueden usar el atributo HandleProcessCorruptingExceptions

Nombre de tipo

TransparentMethodsMustNotHandleProcessCorruptingExceptions

Identificador de comprobación

CA2139

Categoría

Microsoft.Security

Cambio problemático

Motivo

Un método transparente está marcado con el atributo HandleProcessCorruptedStateExceptionsAttribute.

Descripción de la regla

Esta regla desencadena cualquier método que sea transparente e intenta controlar una excepción de daño de proceso utilizando el atributo HandleProcessCorruptedStateExceptionsAttribute.Una excepción de daño de proceso en la versión 4.0 de CLR es una clasificación de excepciones como AccessViolationException.El atributo HandleProcessCorruptedStateExceptionsAttribute solo lo pueden utilizar los métodos críticos para la seguridad, y se omitirá si se aplica a un método transparente.Para controlar las excepciones de daño de proceso, este método debe volverse crítico de seguridad o crítico para la seguridad.

Cómo corregir infracciones

Para corregir una infracción de esta regla, quite el atributo SecurityCriticalAttribute, o marque el método con el atributo HandleProcessCorruptedStateExceptionsAttribute o SecuritySafeCriticalAttribute.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Ejemplo

En este ejemplo, un método transparente se marca con el atributo HandleProcessCorruptedStateExceptionsAttribute y no cumplirá la regla.El método también se debería marcar con el atributo SecuritySafeCriticalAttribute o SecurityCriticalAttribute.

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) { }
        }
    }

}