Sdílet prostřednictvím


CA2134: Metody musejí při přepisování základních metod zachovávat konzistentní transparentnost

TypeName

MethodsMustOverrideWithConsistentTransparency

CheckId

CA2134

Kategorie

Microsoft.Security

Narušující změna

Narušující

Příčina

Toto pravidlo je spuštěno ve chvíli, kdy metoda označena značkou SecurityCriticalAttribute přepisuje průhlednou metodu nebo metodu označenou značkou SecuritySafeCriticalAttribute.Toto pravidlo je také spuštěno, pokud průhledná metoda nebo metoda označená značkou SecuritySafeCriticalAttribute přepisuje metodu označenou značkou SecurityCriticalAttribute.

Pravidlo je použito při přepisování virtuální metody nebo implementaci rozhraní.

Popis pravidla

Toto pravidlo je spuštěno při pokusu změnit bezpečností přístupnost metody výše v řetězci dědičnosti.Je-li například virtuální metoda v základní třídě průhledná nebo bezpečně kritická, musí ji odvozená třída přepsat průhlednou nebo bezpečně kritickou metodou.Pokud jen naopak virtuální metoda bezpečnostně kritická, musí ji odvozená třída přepsat bezpečnostně kritickou metodou.Stejné pravidlo platí pro implementaci metod rozhraní.

Pravidla průhlednosti jsou vynucována, je-li kód kompilován kompilátorem JIT namísto v modulu runtime, aby výpočet průhlednosti neobsahoval informace dynamického typu.Proto musí být výsledek výpočtu průhlednosti určitelný výhradně ze statických typů, které jsou kompilovány kompilátorem JIT, bez ohledu na dynamický typ.

Jak vyřešit porušení

Chcete-li opravit porušení tohoto pravidla, změňte průhlednost metody přepisující virtuální metody nebo implementující rozhraní tak, aby se shodovala s průhledností virtuální metody nebo metody rozhraní.

Kdy potlačit upozornění

Upozornění tohoto pravidla nepotlačujte.Porušení tohoto pravidla vyvolají v sestaveních používajících průhlednost úrovně 2 za běhu výjimku TypeLoadException.

Příklady

Kód

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

}

Viz také

Koncepty

Transparentní kód pro zabezpečení, úroveň 2