Partilhar via


CA2139: Métodos transparentes podem não usar o atributo HandleProcessCorruptingExceptions

Item Valor
RuleId CA2139
Categoria Microsoft.Security
Alteração da falha Quebra

Causa

Um método transparente é marcado com o atributo HandleProcessCorruptedStateExceptionsAttribute.

Observação

Esta regra foi preterida. Para obter mais informações, confira Regras preteridas.

Descrição da regra

Esta regra é acionada por qualquer método que seja transparente e tenta tratar uma exceção de corrupção de processo usando o atributo HandleProcessCorruptedStateExceptionsAttribute. Uma exceção de corrupção de processo é uma classificação de exceção do CLR versão 4.0, como AccessViolationException. O atributo HandleProcessCorruptedStateExceptionsAttribute só pode ser usado por métodos de segurança crítica e será ignorado se for aplicado a um método transparente. Para lidar com exceções de corrupção de processo, esse método deve se tornar crítico para segurança ou crítico para segurança e disponível no código transparente.

Como corrigir violações

Para corrigir uma violação dessa regra, remova o atributo HandleProcessCorruptedStateExceptionsAttribute ou marque o método com o atributo SecurityCriticalAttribute ou SecuritySafeCriticalAttribute.

Quando suprimir avisos

Não suprima um aviso nessa regra.

Exemplo

Neste exemplo, um método transparente é marcado com o atributo HandleProcessCorruptedStateExceptionsAttribute e falhará na regra. O método também deve ser marcado com o atributo 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) { }
        }
    }

}