Size: a a a

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

2020 March 31

Э

Эрик in Rust — русскоговорящее сообществo
Mikail Bagishov
В том что в целях оптимизаций компиляторы ограничивают алиасинг
Это ты о чём?
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
Это ты о чём?
let mut ptr = ...;
let ref1 = &mut *ptr;
let ref2 = &mut *ptr;
*ref1=7;
*ref2=8;
Это UB
источник

Э

Эрик in Rust — русскоговорящее сообществo
Если ты про то, что L1 cache у каждого ядра свой, то это не про компилятор.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Mikail Bagishov
let mut ptr = ...;
let ref1 = &mut *ptr;
let ref2 = &mut *ptr;
*ref1=7;
*ref2=8;
Это UB
Ну да, UB. А дальше чего?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Только дереф голого указателя должен браться в ансейф.
источник

MB

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

Э

Эрик in Rust — русскоговорящее сообществo
Box - не голый указатель и у бокса дереф идёт через Deref трейт, так что там только одна мутабельная ссылка может быть, если без ансейфа.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
Ну да, UB. А дальше чего?
UB в данном случае - это как-раз таки нарушение правил алиасинга.
Заметь, что дата рейса тут нет например
источник

В

Вафель in Rust — русскоговорящее сообществo
поменяй порядок и будет
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
Box - не голый указатель и у бокса дереф идёт через Deref трейт, так что там только одна мутабельная ссылка может быть, если без ансейфа.
Это как раз пример того, что указатель и мутабельная ссылка мирно сосуществуют
источник

Э

Эрик in Rust — русскоговорящее сообществo
Там всё нормально. У тебя rf больше не используется, поэтому можешь изи менять через DerefMut бокса.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Вафель
поменяй порядок и будет
Да, ты прав)
Эти stacked borrows слишком умные
источник

Э

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

Э

Эрик in Rust — русскоговорящее сообществo
Вот если порядок поменяешь или напишешь ещё один *rf = 5; после строчки с *b, то тебе выдаст ошибку.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
Там всё нормально. У тебя rf больше не используется, поэтому можешь изи менять через DerefMut бокса.
Я уже сам начал запутываться, но как-то так: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=7bfee373c3af168d26202ca7c0686d1f
Про foo1 не уверен, но в foo11 указатель и ссылка явно перекрываются по времени жизни.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Mikail Bagishov
Я уже сам начал запутываться, но как-то так: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=7bfee373c3af168d26202ca7c0686d1f
Про foo1 не уверен, но в foo11 указатель и ссылка явно перекрываются по времени жизни.
Ты ансейфом обмазался потому что.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Я даже читать это не буду, потому что даже не ясно, что ты пытаешься сделать с этим ансейфом.
источник

MB

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

Э

Эрик in Rust — русскоговорящее сообществo
Я вот когда пишу
let r: &T = Box::leak(Box::new(T::default()));
...
unsafe {let r = Box::from_raw(r as *const T as *mut T);}
Я обязательно пишу комментарии, почему и что.
источник

Э

Эрик in Rust — русскоговорящее сообществo
А там просто три ансейф функции в одном блоке без комментариев.
источник