о гарантиях
Sep. 12th, 2019 11:13 am
fn helper<'a, 'b, T>(_: &'a &'b (), v: &'b T) -> &'a T { v }
/// Turn any `&T` into a `&'static T`. May introduce undefined behavior.
pub fn make_static<'a, T>(input: &'a T) -> &'static T {
let f: fn(_, &'a T) -> &'static T = helper;
f(&&(), input)
}
(отсюда)
Не ожидал, что так просто. Безо всякого unsafe берем и превращаем "одолженную" ссылку на временное значение в "вечную", с соответствующими use-after-free последствиями. А просто дырка в borrow checker'e, и давно уже, все никак не залатают.
no subject
Date: 2019-09-12 01:45 pm (UTC)no subject
Date: 2019-09-12 03:01 pm (UTC)no subject
Date: 2019-09-12 07:46 pm (UTC)no subject
Date: 2019-09-13 09:19 am (UTC)Это демонстрация ошибки в компиляторе, когда получается его надурить и сделать то, что по-хорошему должно быть невозможно. Демонстрация того, что его гарантии корректного присмотра за временами жизни объектов не стопроцентны, там есть дыры.
no subject
Date: 2019-09-13 09:26 am (UTC)no subject
Date: 2019-09-15 05:22 am (UTC)#[test] fn changing_lifetime() { let r; { let x = 5; r = make_static(&x); } println!("r: {}", r); assert_eq!(5, *r) }