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.KeepAlivevolání . Režijní náklady na výkon, které se účtují při použití SafeHandle a v menším stupni, CriticalHandlese 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é