Desreferenciando Ponteiros Brutos

Criar ponteiros Ă© seguro, mas desreferenciĂĄ-los requer unsafe:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Speaker Notes

This slide should take about 10 minutes.

É uma boa prática (e exigida pelo guia de estilo do Android Rust) escrever um comentário para cada bloco unsafe explicando como o código dentro dele satisfaz os requisitos de segurança para a operação insegura que está fazendo.

No caso de desreferĂȘncia de ponteiros, isso significa que os ponteiros devem ser vĂĄlidos, ou seja:

  • O ponteiro deve ser nĂŁo nulo.
  • O ponteiro deve ser desreferenciĂĄvel (dentro dos limites de um Ășnico objeto alocado).
  • O objeto nĂŁo deve ter sido desalocado.
  • NĂŁo deve haver acessos simultĂąneos Ă  mesma localização.
  • Se o ponteiro foi obtido lançando uma referĂȘncia, o objeto subjacente deve estar vĂĄlido e nenhuma referĂȘncia pode ser usada para acessar a memĂłria.

Na maioria dos casos, o ponteiro também deve estar alinhado corretamente.

A seção “NÃO É SEGURO” dĂĄ um exemplo de um tipo comum de bug UB: *r1 tem o tempo de vida 'static, entĂŁo r3 tem o tipo &'static String, e portanto sobrevive a s. Criar uma referĂȘncia a partir de um ponteiro requer muito cuidado.