Инкапсулированный небезопасный Rust
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
pub fn copy(dest: &mut [u8], source: &[u8]) {
let len = dest.len().min(source.len());
let mut i = 0;
while i < len {
// SAFETY: `i` должен находиться в границах, так как получен из source.len()
let new = unsafe { source.get_unchecked(i) };
// SAFETY: `i` должен находиться в границах, так как получен из dest.len()
let old = unsafe { dest.get_unchecked_mut(i) };
*old = *new;
i += 1;
}
}
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, содержащая небезопасные блоки, остаётся корректной, если ни один входной аргумент не может вызвать проблемы с безопасностью памяти».