Condividi tramite


CA2139: I metodi Transparent non possono utilizzare l'attributo HandleProcessCorruptingExceptions

TypeName

TransparentMethodsMustNotHandleProcessCorruptingExceptions

CheckId

CA2139

Category

Microsoft.Security

Breaking Change

Breaking

Causa

Un metodo Trasparent è contrassegnato con l'attributo HandleProcessCorruptedStateExceptionsAttribute.

Descrizione della regola

Questa regola attiva qualsiasi metodo trasparente e tenta di gestire un processo che danneggiando l'eccezione tramite l'attributo HandleProcessCorruptedStateExceptionsAttribute. Un processo che danneggia un'eccezione è una classificazione di eccezioni versione CLR 4.0 di eccezioni come AccessViolationException. L'attributo HandleProcessCorruptedStateExceptionsAttribute può essere utilizzato solo dai metodi critici per la sicurezza e sarà ignorato se applicato a un metodo trasparente. Per gestire le eccezioni che danneggiano il processo, questo metodo deve diventare SecurityCritical o SecuritySafeCritical.

Come correggere le violazioni

Per correggere una violazione di questa regola, rimuovere l'attributo HandleProcessCorruptedStateExceptionsAttribute o contrassegnare il metodo con l'attributo SecurityCriticalAttribute o SecuritySafeCriticalAttribute.

Esclusione di avvisi

Non escludere un avviso da questa regola.

Esempio

In questo esempio, un metodo trasparente viene contrassegnato con l'attributo HandleProcessCorruptedStateExceptionsAttribute e la regola avrà esito negativo. Il metodo deve essere contrassegnato anche con l'attributo SecurityCriticalAttribute o 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) { }
        }
    }

}