Size: a a a

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

2020 March 31

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Нельзя относиться к указателю как к usize.
Одно из требований к указателю - он не должен выходить за границы объекта.
источник

В

Вафель in Rust — русскоговорящее сообществo
Mikail Bagishov
Не совсем как угодно. Я вот удивился, когда узнал про provenance: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=edbe266980e814f7d2bc5b5719abc9b3
ура, UB
источник

Э

Эрик in Rust — русскоговорящее сообществo
Mikail Bagishov
Нельзя относиться к указателю как к usize.
Одно из требований к указателю - он не должен выходить за границы объекта.
Если голый, то пофигу.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Он даже Null может быть и Unaligned.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
Если голый, то пофигу.
Я тебе привел самый что ни на есть голый указатель. Куда еще голее?
источник

Э

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

Э

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

Э

Эрик in Rust — русскоговорящее сообществo
Он не должен выходить за границы и быть unaligned, только в тот момент, когда ты его дерефишь.
источник

В

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

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
источник

Э

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

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
Мири просто тебе рассказывает, что ты вышел за баунды. Там нет UB, пока не дерефишь.
Если miri говорит тебе что-то, содержащее строчку "Undefined Behavior", то у тебя именно что UB )
источник

Э

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

Э

Эрик in Rust — русскоговорящее сообществo
Ну тут ты неправ. Ты кастуешь Unsized reference в Sized pointer. Это как раз UB.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Точнее, референс с неявным типом.
источник

r

red75prime in Rust — русскоговорящее сообществo
Эрик
Нет, мири просто предполагает, что ты будешь использовать этот указатель, а потому говорит, что UB.
Компилятор тоже может это предположить, и использовать для оптимизации - выкинуть этот код, например
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
Нет, мири просто предполагает, что ты будешь использовать этот указатель, а потому говорит, что UB.
https://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.add-1
Ну вот тебе дока, если ты про add().
Выход за границы объекта через add это мгновенно UB.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
Ну тут ты неправ. Ты кастуешь Unsized reference в Sized pointer. Это как раз UB.
На всякий случай дописал as &mut u8. Ничего не поменялось: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=c94d0e4da3d191c030af9285f5d09e41
источник

Э

Эрик in Rust — русскоговорящее сообществo
Mikail Bagishov
https://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.add-1
Ну вот тебе дока, если ты про add().
Выход за границы объекта через add это мгновенно UB.
let ptr = &1_usize as *const usize;
let mut usize = ptr as usize;
usize += 1;
usize -= 1;
let ptr = usize as *const usize;
let ref = unsafe { &*ptr };
источник

Э

Эрик in Rust — русскоговорящее сообществo
На такое будет ругаться, как думаешь?
источник