CA2006: Użyj SafeHandle, aby hermetyzować zasoby natywne
TypeName |
UseSafeHandleToEncapsulateNativeResources |
CheckId |
CA2006 |
Kategoria |
Microsoft.Reliability |
Złamanie zmiany |
Bez podziału |
Przyczyna
Zarządzany kod zastosowań IntPtr dostęp do zasobów macierzystych.
Opis reguły
Korzystanie z IntPtr w kodzie zarządzanym może wskazywać na potencjalny problem bezpieczeństwa i niezawodności.Wszystkie zastosowania IntPtr muszą być przejrzane w celu ustalenia czy wykorzystanie SafeHandle , lub podobnych technologii, jest wymagane w jego miejsce.Wystąpią problemy, jeśli IntPtr reprezentuje zasób macierzysty, takich jak pamięć, dojście do pliku lub gniazda, że kod zarządzany jest uważany za własne.Jeśli kod zarządzany jest właścicielem zasobu, musi również zwolnić zasoby macierzystych, skojarzone z nią ponieważ niedopełnienia mogłoby spowodować wyciek zasobów.
W takich sytuacjach problemy zabezpieczeń lub niezawodności również będzie istnieć, jeśli wielowątkowych dostęp jest dozwolony do IntPtr i sposobu zwalniania zasób, który jest reprezentowany przez IntPtr jest świadczone.Problemy te obejmują recyklingu IntPtr wartość na wydanie zasobów podczas jednoczesne użycie zasobu jest dokonywana w innym wątku.Może to spowodować sytuacje wyścigu, gdzie jeden wątek można odczytać lub zapisać dane, które są skojarzone z niewłaściwej zasobów.Na przykład, jeśli typ swojego przechowuje dojście systemu operacyjnego jako IntPtr i umożliwia użytkownikom zarówno wywołania Close i jakiejkolwiek innej metody, używający dojścia jednocześnie i bez pewnego rodzaju synchronizacji, kod ma uchwyt recyklingu problem.
Ten uchwyt, recyklingu, problem może spowodować uszkodzenie danych i często luki w zabezpieczeniach.SafeHandlei jej element równorzędny klasy CriticalHandle mechanizmu hermetyzacji uchwyt macierzysty do zasobu, dzięki czemu można uniknąć takich problemów wątków.Ponadto można użyć SafeHandle i jego klasy równorzędny CriticalHandle dla innych kwestiach wątkowości, na przykład ścisła kontrola istnienia obiektów zarządzanych, które zawierają kopię uchwyt macierzysty za pośrednictwem wywołania metod macierzystych.W tej sytuacji, często można usunąć wywołania GC.KeepAlive.Wydajność thay narzutów ponieść podczas korzystania z SafeHandle i w mniejszym stopniu, CriticalHandle, często można zmniejszyć przez staranne projektowanie.
Jak naprawić naruszenia
Konwertuj IntPtr użycie SafeHandle do bezpiecznego zarządzania dostępem do zasobów macierzystych.Zobacz SafeHandle odniesienia tematu Przykłady.
Kiedy do pomijania ostrzeżenia
To ostrzeżenie nie należy pomijać.