CA2006: Usar SafeHandle para encapsular recursos nativos

Item Valor
RuleId CA2006
Categoria Microsoft.Reliability
Alteração da falha Sem interrupção

Causa

O código gerenciado usa IntPtr para acessar recursos nativos.

Descrição da regra

O uso de IntPtr em código gerenciado pode indicar um problema de segurança e confiabilidade em potencial. Todos os usos de IntPtr devem ser examinados para determinar se o uso de um SafeHandle, ou tecnologia semelhante, é necessário em seu lugar. Problemas ocorrerão se o IntPtr representar algum recurso nativo, como memória, um identificador de arquivo ou um soquete, dos quais o código gerenciado é considerado ser proprietário. Se o código gerenciado possuir o recurso, ele também deverá liberar os recursos nativos associados a ele, pois não fazê-lo causaria vazamento de recursos.

Nesses cenários, também existirão problemas de segurança ou confiabilidade se o acesso multithread for permitido para o IntPtr e uma maneira de liberar o recurso representado pelo IntPtr for fornecido. Esses problemas envolvem a reciclagem do valor de IntPtr na versão do recurso enquanto o uso simultâneo do recurso está sendo feito em outro thread. Isso pode causar condições de corrida em que um thread pode ler ou gravar dados associados ao recurso errado. Por exemplo, se o seu tipo armazena um identificador do sistema operacional como um IntPtr e permite que os usuários chamem tanto Fechar quanto qualquer outro método que use esse identificador simultaneamente e sem algum tipo de sincronização, seu código tem um problema de reciclagem de identificador.

Esse problema de reciclagem de identificador pode causar corrupção de dados e, com frequência, uma vulnerabilidade de segurança. SafeHandle e sua classe irmã CriticalHandle fornecem um mecanismo para encapsular um identificador nativo em um recurso para que esses problemas de threading possam ser evitados. Além disso, você pode usar SafeHandle e sua classe irmã CriticalHandle para outros problemas de threading, por exemplo, para controlar cuidadosamente o tempo de vida dos objetos gerenciados que contêm uma cópia do identificador nativo sobre chamadas para métodos nativos. Nessa situação, geralmente você pode remover chamadas para GC.KeepAlive. A sobrecarga de desempenho na qual você incorre quando usa SafeHandle e, em menor grau, CriticalHandle, pode ser reduzida com frequência por meio de um design cuidadoso.

Como corrigir violações

Converta o uso de IntPtr em SafeHandle para gerenciar com segurança o acesso aos recursos nativos. Consulte o artigo de referência SafeHandle para obter exemplos.

Quando suprimir avisos

Não suprima esta regra.

Confira também