El uso de IntPtr en código administrado podría indicar un problema de confiabilidad y de seguridad potencial. Todos los usos ...

El uso de IntPtr en código administrado podría indicar un problema de confiabilidad y de seguridad potencial. Todos los usos de IntPtr se deben revisar para determinar si se requiere el uso de SafeHandle (o una tecnología similar) en su lugar. Habrá problemas si IntPtr representa algunos recursos nativos (memoria, identificador de archivos, socket, etc.) que se consideran propiedad del código administrado. Es decir, si se espera que el código administrado, de alguna forma, libere el recurso, al no hacerlo puede originar una fuga del recurso. En dichos escenarios, también se darán problemas de seguridad y confiabilidad si se permite el acceso de varios subprocesos a IntPtr y un medio de liberar el recurso representado por IntPtr. Estos problemas implican el reciclaje del valor de IntPtr cuando se dé la liberación del recurso a la vez que se realiza un uso simultáneo del recurso en otro subproceso, lo que da lugar a condiciones de carrera donde un subproceso puede leer y escribir datos asociados con el recurso incorrecto. Por ejemplo, si el tipo almacena un identificador de SO como IntPtr y permite a los usuarios llamar tanto a Close como a cualquier otro método que use ese identificador simultáneamente (sin ningún tipo de sincronización), el código tiene un problema de reciclaje del identificador, lo que daña los datos y suele vulnerar la seguridad. SafeHandle (y su clase relacionada CriticalHandle) proporcionan un mecanismo para encapsular un identificador nativo para un recurso, con el fin de evitar los mencionados problemas con los subprocesos (además de otros problemas como la necesidad de un control atento de la duración de los objetos administrados que contienen una copia del identificador nativo sobre las llamadas a métodos nativos; es decir, por lo general se pueden quitar las llamadas a GC.KeepAlive). El uso de SafeHandle (y en menor medida de CriticalHandle) conlleva una reducción del rendimiento que, por lo general, se puede solventar con un diseño cuidado.