Compartilhar via


CA2006: Usar o SafeHandle para encapsular os recursos nativos

TypeName

UseSafeHandleToEncapsulateNativeResources

CheckId

CA2006

<strong>Categoria</strong>

Microsoft.Reliability

Alteração significativa

Não-separável

Causa

Gerenciado de código usa IntPtr para acessar recursos nativos.

Descrição da regra

Uso de IntPtr em código gerenciado pode indicar um potencial de segurança e confiabilidade problema. Todos os usos de IntPtr deve ser revisado para determinar se o uso de um SafeHandle , ou uma tecnologia semelhante, é necessária em seu local. Ocorrer problemas se o IntPtr representa algum recurso nativo, como memória, um identificador de arquivo ou um soquete, que o código gerenciado é considerado próprio. Se o código gerenciado possui o recurso, ele também deve liberar os recursos nativos associados a ele, porque uma falha ao fazer isso poderia causar um vazamento de recursos.

Nessas situações, problemas de segurança ou confiabilidade também existirá se multithread de acesso é permitido para o IntPtr e uma maneira de liberar o recurso que é representado pela IntPtr é fornecido. Esses problemas que envolvem a reciclagem da IntPtr valor de recurso da versão enquanto o uso simultâneo do recurso está sendo feito em outro segmento. Isso pode causar condições de corrida, onde um thread pode ler ou gravar dados que está associados com o recurso errado. Por exemplo, se o seu tipo armazena um identificador de sistema operacional como um IntPtr e permite que os usuários chamar ambos Close e qualquer outro método que usa esse identificador simultaneamente e sem algum tipo de sincronização, o seu código possui uma alça de reciclagem de problema.

Esse problema de reciclagem de identificador pode causar corrupção de dados e, freqüentemente, uma vulnerabilidade de segurança. SafeHandlee sua classe irmão CriticalHandle fornecem um mecanismo para encapsular um identificador nativo a um recurso para que tais problemas de threading podem ser evitados. Além disso, você pode usar SafeHandle e sua classe irmão CriticalHandle para outras threads questões, por exemplo, para controlar cuidadosamente o tempo de vida de objetos gerenciados que contêm uma cópia do identificador nativo através de chamadas a métodos nativos. Nessa situação, você pode remover com freqüência chamadas para GC.KeepAlive. O tailandês de sobrecarga de desempenho incorrer em quando você usa SafeHandle e, em menor grau, CriticalHandle, com freqüência pode ser reduzido através de design cuidadoso.

Como corrigir violações

Converter IntPtr uso de SafeHandle para gerenciar com segurança de acesso a recursos nativos. Consulte o SafeHandle tópico de referência para exemplos.

Quando suprimir avisos

Você não deve suprimir esse aviso.

Consulte também

Referência

IDisposable