Size: a a a

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

2020 September 30

Э

Эрик in Rust — русскоговорящее сообществo
Хотя align_to вроде бы внутри ассертит, что длина меньше isize::MAX. А вот с from_raw_parts ты бы обкекался.
источник

BV

Boris Vinogradov in Rust — русскоговорящее сообществo
Aragaer
да, но не любые 8 бит адресуемы
любые, но не все будут там где нужно
источник

Э

Эрик in Rust — русскоговорящее сообществo
Вот поэтому я и не люблю unsafe.
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
Хотя align_to вроде бы внутри ассертит, что длина меньше isize::MAX. А вот с from_raw_parts ты бы обкекался.
блинба, надо проверить что я нигде так-же не налажал уже...
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Aragaer
а на архитектурах, где байты не 8 бит (существуют такие, где 16) уже может быть и не так хорошо
Кстати, а Rust-то поддерживает хоть одну такую архитектуру?
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Эрик
Берём x32 машину.

Делаем
let v: Vec<u64> = vec![0; isize::MAX / 4];


пихаем &v в твою функцию.
Делаем .index(len - 1) на получившуюся слайсу.
Получаем UB.
Это сугубо теоретическая проблема.
На практике если ты создал такой вектор, то он у тебя занимает буквально половину памяти. stdlib в нескольких местах полагается на то, что этого не происходит.
источник

BV

Boris Vinogradov in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Кстати, а Rust-то поддерживает хоть одну такую архитектуру?
а надо смотреть по tier'ам
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Кстати, а Rust-то поддерживает хоть одну такую архитектуру?
Вроде нет
источник

Э

Эрик in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Это сугубо теоретическая проблема.
На практике если ты создал такой вектор, то он у тебя занимает буквально половину памяти. stdlib в нескольких местах полагается на то, что этого не происходит.
Не-а, вектор ассертит только что capacity < isize::MAX, а вот длину в байтах — нет.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Эрик
Не-а, вектор ассертит только что capacity < isize::MAX, а вот длину в байтах — нет.
Если у тебя есть вектор на isize::MAX байт, у тебя уже такие серьёзные проблемы, что каст — наименьшая из них.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
Не-а, вектор ассертит только что capacity < isize::MAX, а вот длину в байтах — нет.
Длина в байтах не больше capacity в байтах, а она тоже чекается насколько я помню.
источник

EG

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

Э

Эрик in Rust — русскоговорящее сообществo
А, да, ошибся, там Layout::size в байтах возвращает.
источник

BV

Boris Vinogradov in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Но если тебя так волнуют потенциальные проблемы в том случае, если ты пытаешься создать вектор размером в половину всей адресуемой памяти, то можно просто добавить ассерт.
на половину памяти в х32 не выйдет чисто физически
источник

Э

Эрик in Rust — русскоговорящее сообществo
Boris Vinogradov
на половину памяти в х32 не выйдет чисто физически
Руками аллоцировать?
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Mikail Bagishov
Длина в байтах не больше capacity в байтах, а она тоже чекается насколько я помню.
источник

BV

Boris Vinogradov in Rust — русскоговорящее сообществo
Эрик
Руками аллоцировать?
да, там до 2 ГБ даётся пользователю адресного пространства
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Если ты не пишешь библиотеку для криптографии или кровавого эмбеддеда, ИМХО, ты можешь немного расслабиться и предположить, что векторов размеров в isize::MAX байт не существует.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
И вообще слайсов.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Технически, можно собрать слайс не из вектора.
Можно ммапнуть большой файл в виртуальную память и оттуда взять слайс произвольного размера.
источник