Использование блока unsafe
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn main() {
let numbers = vec![0, 1, 2, 3, 4];
let i = numbers.len() / 2;
let x = *numbers.get_unchecked(i);
assert_eq!(i, x);
}
Пройдитесь по коду. Убедитесь, что аудитория знакома с оператором разыменования.
Попробуйте скомпилировать код и вызовите ошибку компилятора.
Добавьте небезопасный блок:
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn main() {
let numbers = vec![0, 1, 2, 3, 4];
let i = numbers.len() / 2;
let x = unsafe { *numbers.get_unchecked(i) };
assert_eq!(i, x);
}
Попросите аудиторию провести ревью кода. Подводите слушателей к добавлению комментария о безопасности.
Добавьте комментарий о безопасности:
#![allow(unused)]
fn main() {
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
// SAFETY: `i` должен находиться в диапазоне 0..numbers.len()
}
Предлагаемое решение
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn main() {
let numbers = vec![0, 1, 2, 3, 4];
let i = numbers.len() / 2;
let x = unsafe { *numbers.get_unchecked(i) };
assert_eq!(i, x);
}