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.