1. O limite unsafe
Flecha segura prova tempos de vida de referências, limites de slices,
movimentos de recursos e chamadas tipadas. unsafe existe para endereços
brutos, alocação bruta e contratos nativos cuja validade vem de fora dessas
provas. Antes de usar, escreva a invariante e procure uma referência, slice,
valor proprietário ou wrapper seguro que já a expresse.
Coloque a operação bruta em função privada ou bloco pequeno. Valide tamanhos, alinhamento, nulidade, tempo de vida, propriedade e erros antes da fronteira. Retorne um valor seguro comum ou erro explícito.
Exemplo testado
Escreva o contrato do ponteiro na menor fronteira enquanto copiar endereços continua seguro.
Arquivo: curriculum/main-evidence/single/unsafe_pointers.fl
// Build: build/flecha build examples/unsafe_pointers.fl -o build/unsafe_pointers// Prints 42 and exits with 42. All pointers below refer to live local storage.
unsafe void write(constptr i32 destination, i32 value) { // The pointer binding is fixed; its target remains writable. *destination = value;}
unsafe i32 read(*const i32 source) { // The target is read-only, including inside this unsafe function. return *source;}
*i32 pass_pointer(*i32 pointer) { // Copying an address does not access its target and needs no unsafe block. return pointer;}
i32 main() { i32 value = 0; *i32 pointer = none; if pointer != null { return 1; }
unsafe { pointer = &raw value; write(pointer, 40); constptr i32 fixed = pointer; *fixed = *fixed + 2;
// Read-only access may be added, but never removed implicitly. *const i32 readOnly = fixed; if read(readOnly) != 42 { return 2; }
// Nested pointers preserve each layer's qualifiers. **i32 slot = &raw pointer; if **slot != 42 { return 3; } }
pointer = pass_pointer(pointer); unsafe { // value still lives here. The unsafe block did not free anything. if *pointer != 42 { return 4; } } stdoutln(value); return value;}O bloco acima é o arquivo completo executado pelos comandos abaixo.
O binding seguro mantém a cópia comum de endereços fora de unsafe. Apenas a operação que dereferencia o ponteiro bruto cruza a fronteira, limitando a invariante que a revisão precisa estabelecer.
Comandos
flecha check curriculum/main-evidence/single/unsafe_pointers.flflecha build curriculum/main-evidence/single/unsafe_pointers.fl -o build/unsafe_pointersbuild/unsafe_pointersSaída esperada
42status de saída: 42Referência relacionada: /examples/unsafe_pointers/.