Udostępnij za pośrednictwem


CA2139: Jawne metody mogą nie używać atrybutu HandleProcessCorruptingExceptions

TypeName

TransparentMethodsMustNotHandleProcessCorruptingExceptions

CheckId

CA2139

Kategoria

Microsoft.Security

Zmiana kluczowa

Kluczowa

Przyczyna

Przezroczysta metoda jest oznaczona atrybutem HandleProcessCorruptedStateExceptionsAttribute.

Opis reguły

Ta reguła jest wywoływana przez każdą metodę, która jest przejrzysta i próbuje obsłużyć wyjątek uszkodzenia procesu przy użyciu atrybutu HandleProcessCorruptedStateExceptionsAttribute.Wyjątek uszkodzenia procesu jest klasyfikacją wyjątku CLR w wersji 4.0 wyjątków takich jak AccessViolationException.Atrybut HandleProcessCorruptedStateExceptionsAttribute może być używany tylko przez krytyczne pod względem bezpieczeństwa metody i będzie ignorowany jeśli zostanie zastosowany do metody przezroczystej.W celu obsługi wyjątków uszkodzenia procesu, metoda ta musi stać się metodą krytyczną pod względem zabezpieczeń lub krytyczną pod względem bezpieczeństwa zabezpieczeń.

Jak naprawić naruszenia

W celu naprawienia naruszenia tej zasady, należy usunąć atrybut HandleProcessCorruptedStateExceptionsAttribute lub oznaczyć metodę atrybutem SecurityCriticalAttribute lub SecuritySafeCriticalAttribute.

Kiedy pominąć ostrzeżenia

Nie należy pomijać ostrzeżenia dotyczącego tej reguły.

Przykład

W tym przykładzie metoda przezroczysta jest oznaczona atrybutem HandleProcessCorruptedStateExceptionsAttribute i nie spełni reguły.Metoda powinna również być oznaczona atrybutem SecurityCriticalAttribute lub 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) { }
        }
    }

}