Die Verwendung von IntPtr in verwaltetem Code kann auf ein potenzielles Sicherheitsrisiko und Zuverlässigkeitsproblem hinweisen. ...

Die Verwendung von IntPtr in verwaltetem Code kann auf ein potenzielles Sicherheitsrisiko und Zuverlässigkeitsproblem hinweisen. Für alle Vorkommen von IntPtr muss überprüft werden, ob stattdessen die Verwendung von SafeHandle (oder einer ähnlichen Technologie) erforderlich ist. Probleme treten auf, wenn IntPtr eine systemeigene Ressource darstellt (Speicher, Dateihandle, Socket usw.), von der angenommen wird, dass sie sich im Besitz des verwalteten Codes befindet. Beispielsweise wird erwartet, dass verwalteter Code die Ressource auf bestimmte Weise freigibt. Wenn dies nicht der Fall ist, kann ein Ressourcenverlust eintreten. In solchen Szenarios treten Sicherheitsrisiken oder Zuverlässigkeitsprobleme auch auf, wenn Multithreaded-Zugriff auf IntPtr zulässig ist und IntPtr eine Möglichkeit zum Freigeben der Ressource darstellt. Zu diesen Problemen gehört das Recycling des IntPtr-Werts bei der Ressourcenfreigabe während der gleichzeitigen Verwendung der Ressource für einen anderen Thread. Dies führt zu Racebedingungen, unter denen ein Thread Daten lesen oder schreiben kann, die der falschen Ressource zugeordnet sind. Wenn der Typ beispielsweise ein Betriebssystemhandle als IntPtr speichert und zulässt, dass Benutzer die Close-Methode und eine beliebige andere Methode aufrufen, die dieses Handle (ohne jegliche Synchronisierung) gleichzeitig verwendet, liegt im Code ein Problem beim Recyceln von Handles vor, was zu Datenbeschädigungen und häufig zu einem Sicherheitsrisiko führt. SafeHandle (und die gleichgeordnete Klasse CriticalHandle) bieten einen Mechanismus zum Kapseln eines systemeigenen Handles in einer Ressource, sodass solche Threadingprobleme vermieden werden können (ebenso wie andere Probleme, beispielsweise die Notwendigkeit der sorgfältigen Kontrolle der Lebensdauer von verwalteten Objekten, die eine Kopie des systemeigenen Handles über Aufrufe an systemeigene Methoden enthalten, d. h., Sie können Aufrufe von GC.KeepAlive in vielen Fällen entfernen). Beim Verwenden von SafeHandle (und in geringerem Maße beim Verwenden von CriticalHandle) treten implizite Leistungsverluste auf, die oft durch einen sorgfältigen Entwurf gemindert werden können.