Скорее всего, Rust предотвратил бы это.
Это
line = line + 4;
- это не то, что мы бы сделали в Rust. Мы редко используем сырые указатели напрямую, предпочитая более удобные и более безопасные упаковщики с нулевой стоимостью, такие как ломтики. На самом деле арифметика raw-pointer c настолько редка, что у нас даже нет операторов для нее (только методы). Срезы гарантированно указывают на действительную память и знают об их размере, поэтому, если бы разработчики использовали &[u8]
для line
, это, вероятно, могло бы стать в Rust:
line = &line[4..];
, но по умолчанию оператор индексации выполняет проверку границ, паникуя, если индексы выходят за пределы. Это предотвратит недопустимое чтение, которое следует в остальной части кода C.
Конечно, это предполагает, что разработчики использовали бы только безопасный Rust. Если бы они сочли эту ветку достаточно важной, чтобы заслужить некоторые дополнительные оптимизации, использование которых могло бы потребовать unsafe
(например, вызов get_unchecked
после того, как они заметили (или предположили !?), что компилятор не может оптимизировать проверка привязки), в Rust могут возникнуть те же проблемы, что и в C.
По умолчанию Rust безопасен только .