Compartilhar via


Usar o SafeHandle para encapsular recursos nativo

TypeName

UseSafeHandleToEncapsulateNativeResources

CheckId

CA2006

Category (Categoria)

Microsoft.confiabilidade

Quebrando alterar

Não separável

Causa

Gerenciado código usa IntPtr para acessar recursos nativo.

Descrição da regra

Uso de IntPtr no 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 utilizar de um SafeHandle, ou tecnologia semelhante, é necessário em seu lugar. Ocorrer problemas se o IntPtr representa algum recurso nativo, sistema autônomo memória, identificador de arquivo, soquete e assim por diante, o código gerenciado é considerado sistema autônomo o próprio. Ou seja, código gerenciado é esperado para liberar o recurso e se isso causaria vazamento do recurso.

Em tais situações, segurança ou problemas de confiabilidade também existirá se o multithread acesso for permitido para o IntPtr e uma maneira de liberar o recurso representado pela IntPtr. Esses problemas envolvam a reciclagem do IntPtr valor na versão do recurso enquanto uso simultâneo do recurso está sendo feito em outro thread, entrelinhamento a condições de corrida em que um thread pode ler ou gravar dados associados ao recurso errado. Por exemplo, se lidar com seus armazenamentos de tipo de um sistema operacional sistema autônomo um IntPtr e permite que sistema autônomo usuários chamar sistema autônomo dois Close e qualquer Outros método usando que manipular simultaneamente e sem algum tipo de sincronização, e, em seguida, seu código possui um problema de reciclagem de identificador.

Esse problema de reciclagem de identificador faz com que dados corrompidos e, freqüentemente, uma vulnerabilidade de segurança.SafeHandle e sua classe irmão CriticalHandle fornecem um mecanismo para encapsular um identificador nativo para um recurso para que esses problemas de threads podem ser evitados. Além disso, você pode usar SafeHandle e sua classe irmão CriticalHandle para outros problemas de threads, por exemplo, para controlar cuidadosamente o tempo de vida de objetos gerenciado que contêm uma cópia de identificador nativo através de chamadas a métodos nativos. Nessa situação, você pode remover com freqüência chamadas de GC.KeepAlive. Sobrecargas de desempenho estão implícitas ao usar SafeHandle e, em menor grau, CriticalHandle, que freqüentemente pode ser reduzido com design cuidadoso.

Como corrigir violações

Converter IntPtr uso de SafeHandle para gerenciar com segurança o acesso aos recursos nativo.

Quando suprimir avisos

Você não deverá suprimir esse aviso.