In Rust zijn er twee hoofdsoorten verwijzingen:
&T): bieden alleen toegang voor lezen.&mut T): maken het mogelijk om de waarde waarop wordt verwezen te wijzigen.Regels:
Voorbeelden van syntaxis:
fn read(val: &i32) { println!("{}", val); } fn write(val: &mut i32) { *val += 1; } let mut x = 5; read(&x); write(&mut x);
Vraag: Is het mogelijk om twee mutable verwijzingen naar één variabele in verschillende zichtbare gebieden van dezelfde functie te maken?
Antwoord: Nee, zelfs als de verwijzingen in verschillende blokken worden gemaakt, bestrijkt het bereik voor het analyseren van leningen de gehele functie of variabele, als de compiler niet kan bewijzen dat de verwijzingen elkaar niet overlappen. Dit leidt vaak tot compilerfouten:
let mut x = 10; let r1 = &mut x; { let r2 = &mut x; // fout! }
Verhaal
Bij de ontwikkeling van een parser probeerde de ontwikkelaar tegelijkertijd een mutabele en een niet-mutable verwijzing naar één buffer op te slaan voor het optimaliseren van lezen en schrijven. Als gevolg hiervan compileerde de code niet, en nadat ze het "ontweken" regel door unsafe verschenen er datalekken.
Verhaal
Aan het begin van een dataverwerkingsproject voerde een van de deelnemers geen "reanalyze borrow checker" uit voor complexe code met geneste gebieden. Als gevolg hiervan leidde dit, vanwege overlappende verwijzingen, tot de klassieke "cannot borrow as mutable because it's also borrowed as immutable"-fout zonder expliciete aanwijzing in de oorspronkelijke code voor het probleem.
Verhaal
In multi-threaded code gebruikten ze gewone verwijzingen om toegang te krijgen tot gedeelde gegevens. Bij het proberen om gegevens in parallelle threads te wijzigen, kregen ze onverwachte compilerfouten en dataraces bij het omzeilen van de borrow checker via onveilige code.