Size: a a a

Rust — русскоговорящее сообществo

2020 October 22

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Возможно, еще безопаснее вместо ManuallyDrop будет MaybeUninit написать
источник

Э

Эрик in Rust — русскоговорящее сообществo
Mikail Bagishov
Возможно, еще безопаснее вместо ManuallyDrop будет MaybeUninit написать
Не будет, потому что всё равно трансмут из T в U.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
Не будет, потому что всё равно трансмут из T в U.
Я про то, что при transmute_copy с ManuallyDrop возникает ситуация, когда есть два побитово идентичных значения типа T. А это несколько подозрительно выглядит.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Например для мутабельных ссылок.
Miri на это не ругается, но это не значит что так можно.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Mikail Bagishov
Я про то, что при transmute_copy с ManuallyDrop возникает ситуация, когда есть два побитово идентичных значения типа T. А это несколько подозрительно выглядит.
Нормально оно выглядит. Оригинальный T имеет подходящий layout, просто потому что, там что сделать memcpy на T чтобы получить ManuallyDrop<T> — норм.
источник

Э

Эрик in Rust — русскоговорящее сообществo
И ссыки там не используются.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
И ссыки там не используются.
Представь что T = &mut U
источник

Э

Эрик in Rust — русскоговорящее сообществo
И всё нормально.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Потому что код про это не знает.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Тогда у тебя лежат две независимые уникальные ссылки на один объект
источник

Э

Эрик in Rust — русскоговорящее сообществo
И если ты убиваешь первую и возвращаешь вторую, то это норма.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Независимые - потому что transmute ломает provenence
источник

Э

Эрик in Rust — русскоговорящее сообществo
С тем же успехом ты можешь доказывать, что pop на Vec<&mut T> — UB.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Так что это то ли нарушение алиасинга, то ли может им стать в будущем при устрожении stacked borrows.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
С тем же успехом ты можешь доказывать, что pop на Vec<&mut T> — UB.
Нет, там все хорошо.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Динамическое хранилище нетипизировано и не обязано содержать валидное значение
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
А стековая переменная обязана быть либо неинициализированной, либо содержать валидное значение.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Mikail Bagishov
А стековая переменная обязана быть либо неинициализированной, либо содержать валидное значение.
Так значение валидное.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Но алиаса там не будет, потому что никто не знает, что там ссылка а не указатель.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Поэтому и использовать как ссылку не может.
источник