о гарантиях
Sep. 12th, 2019 11:13 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
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)