CA2134: Metody muszą przechowywać spójną jawność podczas nadpisywania metod bazowych
Pozycja | Wartość |
---|---|
Ruleid | CA2134 |
Kategoria | Microsoft.Security |
Zmiana powodująca niezgodność | Kluczowa |
Przyczyna
Ta reguła jest uruchamiana, gdy metoda oznaczona za pomocą SecurityCriticalAttribute zastąpi metodę przezroczystą lub oznaczoną symbolem SecuritySafeCriticalAttribute. Reguła jest również uruchamiana, gdy metoda, która jest przezroczysta lub oznaczona za pomocą SecuritySafeCriticalAttribute przesłonięć metodę oznaczoną za SecurityCriticalAttributepomocą metody .
Reguła jest stosowana podczas zastępowania metody wirtualnej lub implementującej interfejs.
Uwaga
Ta reguła została przestarzała. Aby uzyskać więcej informacji, zobacz Przestarzałe reguły.
Opis reguły
Ta reguła jest uruchamiana przy próbach zmiany ułatwień dostępu zabezpieczeń metody dalej w łańcuchu dziedziczenia. Jeśli na przykład metoda wirtualna w klasie bazowej jest przezroczysta lub bezpieczna, klasa pochodna musi zastąpić ją przezroczystą lub bezpieczną metodą krytyczną. Z drugiej strony, jeśli maszyna wirtualna ma krytyczne znaczenie dla zabezpieczeń, klasa pochodna musi zastąpić ją metodą krytyczną dla zabezpieczeń. Ta sama reguła ma zastosowanie do implementowania metod interfejsu.
Reguły przezroczystości są wymuszane, gdy kod jest kompilowany JIT zamiast w czasie wykonywania, dzięki czemu obliczenie przezroczystości nie ma informacji o typie dynamicznym. W związku z tym wynik obliczenia przezroczystości musi być w stanie określić wyłącznie z typów statycznych kompilowanych JIT, niezależnie od typu dynamicznego.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, zmień przejrzystość metody, która zastępuje metodę wirtualną lub implementuje interfejs, aby dopasować przezroczystość metody wirtualnej lub interfejsu.
Kiedy pomijać ostrzeżenia
Nie pomijaj ostrzeżeń z tej reguły. Naruszenia tej reguły powodują czas wykonywania TypeLoadException zestawów korzystających z przezroczystości poziomu 2.
Przykłady
Kod
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() { }
}
}
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla