Desreferenciando Ponteiros Brutos

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

fn main() {
    let mut num = 5;

    let r1 = &mut num as *mut i32;
    let r2 = r1 as *const i32;

    // Seguro porque r1 e r2 foram obtidos atravĂ©s de referĂȘncias e logo Ă©
    // garantido que eles nĂŁo sejam nulos e sejam propriamente alinhados, os objetos
    // cujas referĂȘncias foram obtidas sĂŁo vĂĄlidos por
    // todo o bloco inseguro, e eles não sejam acessados tanto através das
    // referĂȘncias ou concorrentemente atravĂ©s de outros ponteiros.
    unsafe {
        println!("r1 Ă©: {}", *r1);
        *r1 = 10;
        println!("r2 Ă©: {}", *r2);
    }
}

É 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.