Compartir a través de


Utilice SafeHandle para encapsular los recursos nativos

Actualización: noviembre 2007

     TypeName

UseSafeHandleToEncapsulateNativeResources

Identificador de comprobación

CA2006

Category

Microsoft.Reliability

Cambio problemático

No problemático

Motivo

El código administrado utiliza IntPtr para tener acceso a los recursos nativos.

Descripción de la regla

El uso de IntPtr en código administrado podría indicar un posible problema para la seguridad y la confiabilidad. Todos los usos de IntPtr se deben revisar para determinar se necesita utilizar en su lugar SafeHandle o una tecnología similar. Se producirá un problema si IntPtr representa algún recurso nativo, como memoria, identificador de archivos, socket, etc. que se considere propiedad del código administrado. Es decir, si se espera que el código administrado libere el recurso y el hecho de no hacerlo pueda provocar la pérdida de recursos.

En estos casos, además existirán problemas de seguridad o confiabilidad si se permite el acceso multiproceso a IntPtr y una manera de liberar el recurso representado por IntPtr. Estos problemas incluyen el reciclaje del valor IntPtr al liberar el recurso mientras en otro subproceso se está utilizando el mismo recurso simultáneamente, lo que provoca condiciones de anticipación en que un subproceso puede leer o escribir datos asociados al recurso incorrecto. Por ejemplo, si el tipo almacena un identificador OS como IntPtr y permite a los usuarios llamar a Close y a cualquier otro método que utilice simultáneamente este indicador, y sin que exista algún tipo de sincronización, el código sufrirá un problema de reciclaje de indicadores.

Este problema de reciclaje de indicadores daña los datos y, con frecuencia, constituye una vulnerabilidad de la seguridad. SafeHandle y su clase secundaria relacionada, CriticalHandle, proporcionan un mecanismo para encapsular un indicador nativo a un recurso a fin de evitar este tipo de problemas de subprocesos. Además, puede utilizar SafeHandle y su clase secundaria relacionada CriticalHandle para otros problemas con subprocesos, por ejemplo, para controlar la duración de los objetos administrados que contienen una copia del indicador nativo sobre las llamadas a los métodos nativos. En esta situación, con frecuencia se puede quitar las llamadas a GC.KeepAlive. Existen sobrecargas implícitas de rendimiento cuando se utiliza SafeHandle y, en menor grado, CriticalHandle; esto se puede reducir con frecuencia mediante un diseño cuidadoso.

Cómo corregir infracciones

Convierta el uso de IntPtr en SafeHandle para administrar sin ningún riesgo el acceso a los recursos nativos.

Cuándo suprimir advertencias

Esta advertencia no se debe suprimir.