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