Безопасный Rust
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
pub fn copy(dest: &mut [u8], source: &[u8]) {
for (dest, src) in dest.iter_mut().zip(source) {
*dest = *src;
}
}
fn main() {
let a = &[114, 117, 115, 116];
let b = &mut [82, 85, 83, 84];
println!("{}", String::from_utf8_lossy(b));
copy(b, a);
println!("{}", String::from_utf8_lossy(b));
}
«В реализации используется только безопасный Rust».
Что из этого можно вынести?
«Функция copy, реализованная на безопасном Rust, не может вызвать проблемы с безопасностью памяти. Это справедливо для всех возможных входных аргументов».
«Например, используя итераторы Rust, мы можем гарантировать, что никогда не получим ошибок, связанных с прямой работой с указателями, например не понадобятся проверки на null или на границы».
Спросите: «Можете назвать ещё какие-нибудь?»
- Нет проблем с псевдонимами
- Висящие указатели невозможны
- Выравнивание будет корректным
- Нельзя случайно прочитать неинициализированную память
«Можно сказать, что функция copy корректна, потому что Rust гарантирует выполнение всех предусловий безопасности».
«С точки зрения программиста, поскольку функция реализована на безопасном Rust, можно считать, что у неё нет предусловий безопасности».
«Это не значит, что copy всегда сделает то, чего хочет вызывающий код. Если в срезе dest недостаточно места, данные не будут скопированы».