Deep dive into the Polonius model checker
by H. Haldi and M. Algelly
Report of the 4th of April 2021
let mut x = 5;
let y = &mut x;
// here y is no longer alive
println!("x: {}", x);
// x: 5
let mut x = 5;
let y = &mut x;
println!("x: {}", x);
*y = 4; // <-- here y is used, so it is still alive
// does not compile
// x is already borrowed as mutable
let r;
{
let x = 5;
r = &x;
}
println!("r: {}" , r);
// error[E0597]: `x` does not live long enough
// r = &x;
// ^^ borrowed value does not live long enough
A path P is an expression that leads to a memory location.
e.g. x
, x.f
, *x.f
, (*x.f)[_]
A loan is a name for a borrow expression, e.g. &x
.
Associated with a path and a mode (shared or mutable).
Error occurs at statement N if:
let mut x: u32 = 22; // path P
let y: &u32 = &x; // loan L shares `x`
x += 1; // statement N accesses path `x`, violating L
print(y) // L is live
/*0*/ let mut x: u32 = 22;
/*1*/ let y: &{2, 3} u32 = &{2, 3} x;
/*2*/ x += 1;
/*3*/ print(y);
x
, so violates the terms of &x
loan from line 1=> ERROR
/*0*/ let mut x: u32 = 22;
/*1*/ let y: &{L1} u32 = &{L1} x /* Loan L1 */;
/*2*/ x += 1;
/*3*/ print(y);
x
has origin L1y
has the same origin L1x
, so violates the terms of the loan L1y
is live on line 2 and its type includes L1
y
is &{L1} u32
=> ERROR