Partager via


Utiliser SafeHandle pour encapsuler les ressources natives

Mise à jour : novembre 2007

TypeName

UseSafeHandleToEncapsulateNativeResources

CheckId

CA2006

Catégorie

Microsoft.Reliability

Modification avec rupture

Modification sans rupture

Cause

Le code managé utilise IntPtr pour accéder aux ressources natives.

Description de la règle

L'utilisation de IntPtr dans du code managé peut être le signe d'un problème potentiel de sécurité et de fiabilité. Toute utilisation de IntPtr doit être passée en revue pour déterminer s'il est nécessaire de recourir à un SafeHandle ou une technologie similaire à la place. Des problèmes surviennent si IntPtr désigne une ressource native, par exemple la mémoire, le handle de fichier, le socket, etc., considérée comme appartenant au code managé. En d'autres termes, le code managé est censé libérer la ressource, et risque de provoquer une fuite de la ressource s'il ne le fait pas.

Dans ces scénarios, des problèmes de sécurité et de fiabilité se présentent également si l'accès multithread est accordé au IntPtr, tout comme la possibilité de libérer la ressource représentée par IntPtr. Ces problèmes impliquent le recyclage de la valeur IntPtr lors de la libération de la ressource pendant l'utilisation simultanée de cette dernière sur un autre thread, ce qui entraîne des conditions de concurrence critique dans lesquelles un thread peut lire ou écrire des données associées à la mauvaise ressource. Par exemple, si votre type stocke un handle de système d'exploitation comme IntPtr et autorise les utilisateurs à appeler à la fois la méthode Close et toute autre méthode utilisant ce handle en même temps (avec un degré de synchronisation), votre code est confronté un problème du recyclage du handle

susceptible de corrompre les données et, souvent, de rendre la sécurité plus vulnérable. SafeHandle et sa classe sœur CriticalHandle fournissent un mécanisme permettant d'encapsuler un handle natif dans une ressource pour éviter ces problèmes de thread. En outre, vous pouvez utiliser SafeHandle et sa classe sœur CriticalHandle pour d'autres problèmes de thread, notamment la nécessité de contrôler avec soin la durée de vie des objets managés contenant une copie du handle natif par rapport aux appels aux méthodes natives. Dans cette situation, vous pouvez souvent supprimer des appels à GC.KeepAlive. L'utilisation de SafeHandle signifie implicitement une surcharge de performances et, à un moindre degré, de CriticalHandle, qu'il est possible de minimiser avec une conception rigoureuse.

Comment corriger les violations

Convertissez l'utilisation de IntPtr en SafeHandle pour gérer sans risque l'accès aux ressources natives.

Quand supprimer les avertissements

Vous ne devez pas supprimer cet avertissement.