тебя &[u64] слайса. Сможешь без UB кастануть её в &[u8]?
Почему нет? Alignment у u64 более строгий, все значения конкретных байтов u64 корректны для u8, количество байтов всегда целое, длину можно легко посчитать, что я упускаю?
align_to и вперёд? Ну или slice::from_raw_parts + as *const _
а вот порядок этих байт может быть разным
А это порождает UB? Каким образом? Результат может получиться разным, но он будет разным конкретным определённым способом.
Берём x32 машину. Делаем let v: Vec<u64> = vec![0; isize::MAX / 4]; пихаем &v в твою функцию. Делаем .index(len - 1) на получившуюся слайсу. Получаем UB.
Это сугубо теоретическая проблема. На практике если ты создал такой вектор, то он у тебя занимает буквально половину памяти. stdlib в нескольких местах полагается на то, что этого не происходит.
Не-а, вектор ассертит только что capacity < isize::MAX, а вот длину в байтах — нет.
Если у тебя есть вектор на isize::MAX байт, у тебя уже такие серьёзные проблемы, что каст — наименьшая из них.
Длина в байтах не больше capacity в байтах, а она тоже чекается насколько я помню.
https://github.com/rust-lang/rust/blob/c0127e4dbf3a9d3a67ddb1da19f8441019aab8f8/library/alloc/src/raw_vec.rs#L529
Обсуждают сегодня