thedeemon: (Default)
[personal profile] thedeemon
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, и давно уже, все никак не залатают.

Date: 2019-09-12 01:45 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
А чо, так можно было?! И работает? Как кастинг в джаве.

Date: 2019-09-12 07:46 pm (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
А запутанный компилятор не будет выдавать запутанные сообщения об ошибках? Обычно, это самый тонкий момент во всех трюках. Работает прекрасно до тех пор, как что-то пошло не так.

Date: 2019-09-13 09:26 am (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
Понятно. Я было подумал, что так и задумано.

Date: 2019-09-15 05:22 am (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Just tested. It worked!

    #[test]
    fn changing_lifetime() {
        let r;
        {
            let x = 5;
            r = make_static(&x);
        }
        println!("r: {}", r);
        assert_eq!(5, *r)
    }

Profile

thedeemon: (Default)
Dmitry Popov

May 2025

S M T W T F S
    123
45678910
11 121314151617
18192021222324
25262728293031

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 15th, 2025 10:05 am
Powered by Dreamwidth Studios