История изменений
Исправление red75prim, (текущая версия) :
Я уже 4 года пишу на Расте. И сегодня вот написал код, который выглядит нормально, но на него ругается MIRI: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=366116fc046c3e031268ddc40579dcd0 . Смотреть: tools -> miri.
Больше там приходиться учитывать: всё что в С + zero-sized types, stacked borrows, доступ к памяти за пределами того на что указывала ссылка из которой получен указатель - UB. То есть let a = vec![1,2]; let ptr = &a[0]; ptr.offset(1).read()
- UB. let ptr = a.as_ptr(); ptr.offset(1).read()
- OK. Конвертация из ссылки в &mut, если ещё один такой &mut есть - UB. Возможно что-то ещё.
Но, да - то, что unsafe код можно изолировать - перевешивает.
Исходная версия red75prim, :
Я уже 4 года пишу на Расте. И сегодня вот написал код, который выглядит нормально, но на него ругается MIRI: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=366116fc046c3e031268ddc40579dcd0 . Смотреть: tools -> miri.
Больше там приходиться учитывать: всё что в С + zero-sized types, stacked borrows, доступ к памяти за пределами того на что указывала ссылка из которой получен указатель - UB. То есть let a = vec![1,2]; let ptr = &a[0]; ptr.offset(1).read()
- UB. let ptr = a.as_ptr(); ptr.offset(1).read()
- OK.
Но, да - то, что unsafe код можно изолировать - перевешивает.