CA2006: Použijte SafeHandle pro zapouzdření nativních prostředků
Zboží | Hodnota |
---|---|
RuleId | CA2006 |
Kategorie | Microsoft.Reliability |
Změna způsobující chybu | Nenarušující |
Příčina
Spravovaný kód používá IntPtr pro přístup k nativním prostředkům.
Popis pravidla
Použití ve spravovaném IntPtr
kódu může znamenat potenciální problém se zabezpečením a spolehlivostí. Všechna použití IntPtr
musí být zkontrolována, aby bylo možné určit, zda je na svém místě vyžadováno použití SafeHandle nebo podobné technologie. K problémům dojde v případě IntPtr
, že představuje nějaký nativní prostředek, jako je paměť, popisovač souboru nebo soket, který je spravovaný kód považován za vlastní. Pokud spravovaný kód vlastní prostředek, musí také uvolnit nativní prostředky přidružené k němu, protože selhání by to způsobilo únik prostředků.
V takových scénářích budou existovat také problémy se zabezpečením nebo spolehlivostí, pokud je přístup s více vlákny povolený IntPtr
a způsob uvolnění prostředku, který je reprezentován daným IntPtr
prostředkem. Tyto problémy zahrnují recyklaci IntPtr
hodnoty uvolnění prostředků, zatímco současné použití prostředku probíhá v jiném vlákně. To může způsobit časování, kdy jedno vlákno může číst nebo zapisovat data přidružená k nesprávnému prostředku. Pokud váš typ například ukládá popisovač operačního systému jako IntPtr
popisovač a umožňuje uživatelům volat metodu Close i jakoukoli jinou metodu, která tento popisovač používá současně a bez nějakého druhu synchronizace, má váš kód problém s recyklací popisovače.
Tento problém s recyklací může způsobit poškození dat a často ohrožení zabezpečení. SafeHandle
a její třída na stejné úrovni CriticalHandle poskytují mechanismus zapouzdření nativního popisovače prostředku, aby takové problémy s vlákny bylo možné vyhnout. Kromě toho můžete použít SafeHandle
a její třídu CriticalHandle
na stejné úrovni pro jiné problémy s vlákny, například k pečlivé kontrole životnosti spravovaných objektů, které obsahují kopii nativního popisovače přes volání nativních metod. V takové situaci můžete často odebírat GC.KeepAlive
volání . Režijní náklady na výkon, které se účtují při použití SafeHandle
a v menším stupni, CriticalHandle
se dají často snížit pomocí pečlivého návrhu.
Jak opravit porušení
Převeďte IntPtr
využití na SafeHandle
bezpečnou správu přístupu k nativním prostředkům. Příklady najdete v referenčním SafeHandle článku.
Kdy potlačit upozornění
Nepotlačujte toto upozornění.
Viz také
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro