Condividi tramite


CA2134: I metodi devono conservare trasparenza consistente durante l'override dei metodi base

TypeName

MethodsMustOverrideWithConsistentTransparency

CheckId

CA2134

Category

Microsoft.Security

Breaking Change

Breaking

Causa

Questa regola funziona quando un metodo contrassegnato con SecurityCriticalAttribute esegue l'override di un metodo trasparente o contrassegnato con SecuritySafeCriticalAttribute.La regola funziona anche quando un metodo che è trasparente o contrassegnato da SecuritySafeCriticalAttribute esegue l'override di un metodo contrassegnato con SecurityCriticalAttribute.

La regola è applicata in caso di esecuzione dell'override di un metodo virtuale o di implementazione di un'interfaccia.

Descrizione della regola

Questa regola funziona su tentativi di modificare l'accessibilità di sicurezza di un metodo più distante sulla catena di ereditarietà.Ad esempio, se un metodo virtuale in una classe di base è trasparente o SafeCrtical, la classe derivata deve eseguire l'override con un metodo trasparente o SafeCritical.Viceversa, se SecurityCritical virtuale, la classe derivata deve eseguire l'override con un metodo SecurityCritical.La stessa regola si applica per l'implementazione dei metodi di interfaccia.

Le regole di trasparenza sono applicate quando il codice è compilato tramite JIT anziché in fase di esecuzione, in modo che il calcolo della trasparenza non dispone di informazioni dinamiche sul tipo.Pertanto, il risultato del calcolo della trasparenza deve poter essere determinato soltanto dai tipi statici che sono stati compilati tramite JIT, indipendentemente dal tipo dinamico.

Come correggere le violazioni

Per correggere una violazione di questa regola, modificare la trasparenza del metodo che sta eseguendo l'override di un metodo virtuale o sta implementando un'interfaccia per mettere in corrispondenza la trasparenza del metodo di interfaccia o virtuale.

Esclusione di avvisi

Non escludere gli avvisi da questa regola.Violazioni di questa regola comporteranno un runtime TypeLoadException per assembly che utilizzano trasparenza di livello 2.

Esempi

Codice

using System;
using System.Security;

namespace TransparencyWarningsDemo
{

    public interface IInterface
    {
        void TransparentInterfaceMethod();

        [SecurityCritical]
        void CriticalInterfaceMethod();
    }

    public class Base
    {
        public virtual void TransparentVirtual() { }

        [SecurityCritical]
        public virtual void CriticalVirtual() { }
    }

    public class Derived : Base, IInterface
    {
        // CA2134 violation - implementing a transparent method with a critical one.  This can be fixed by any of: 
        //   1. Making IInterface.TransparentInterfaceMethod security critical 
        //   2. Making Derived.TransparentInterfaceMethod transparent 
        //   3. Making Derived.TransparentInterfaceMethod safe critical
        [SecurityCritical]
        public void TransparentInterfaceMethod() { }

        // CA2134 violation - implementing a critical method with a transparent one.  This can be fixed by any of: 
        //   1. Making IInterface.CriticalInterfaceMethod transparent 
        //   2. Making IInterface.CriticalInterfaceMethod safe critical 
        //   3. Making Derived.TransparentInterfaceMethod critical 
        public void CriticalInterfaceMethod() { }

        // CA2134 violation - overriding a transparent method with a critical one.  This can be fixed by any of: 
        //   1. Making Base.TrasnparentVirtual critical 
        //   2. Making Derived.TransparentVirtual transparent 
        //   3. Making Derived.TransparentVirtual safe critical
        [SecurityCritical]
        public override void TransparentVirtual() { }

        // CA2134 violation - overriding a critical method with a transparent one.  This can be fixed by any of: 
        //   1. Making Base.CriticalVirtual transparent 
        //   2. Making Base.CriticalVirtual safe critical 
        //   3. Making Derived.CriticalVirtual critical 
        public override void CriticalVirtual() { }
    }

}

Vedere anche

Concetti

Codice SecurityTransparent, livello 2