Partilhar 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 os recursos nativos.

Descrição da regra

Uso de IntPtr em código gerenciado pode indicar um possível problema de segurança e confiabilidade.Todos os usos de IntPtr deve ser revisado para determinar se o uso de um SafeHandle , ou uma tecnologia semelhante, é necessária em seu lugar.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 para ser adquirida.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 causaria o vazamento do recurso.

Em cenários assim, problemas de segurança ou confiabilidade também existirá se multithread 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 na liberação de recursos, enquanto o uso simultâneo do recurso está sendo feito em outro thread.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 um problema de reciclagem de identificador.

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 você incorrer ao usar SafeHandle e, em menor grau, CriticalHandle, com freqüência podem ser reduzidos por meio de um projeto cuidadoso.

Como corrigir violações

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

Quando suprimir avisos

Você não deve suprimir esse aviso.

Consulte também

Referência

IDisposable