RS Rust  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

unsafe Rust

Проверяет допустимые unsafe-операции, работу с сырыми указателями, формулировку инвариантов и построение безопасных оболочек. Вопросы распределены между чтением кода, диагностикой компиляции, выбором исправления, граничными случаями и инженерными решениями. Базовый синтаксис соответствует Rust 2024 edition; задания не требуют nightly, если это прямо не сказано.

Отвечено: 0 из 30
--:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат, результаты по 6 тематическим шкалам и подробные объяснения.
Вопрос 1 из 30
Какой эксплуатационный край отличает контракт «Инварианты» от удачного примера?
Вопрос 2 из 30
Какое изменение окружения может повлиять на вывод о «Сырые указатели»?
Вопрос 3 из 30
Какое изменение входа способно поменять вывод о механизме «Тестирование и инструменты Cargo» в контексте «unsafe Rust»?
Вопрос 4 из 30
Какое изменение окружения может повлиять на вывод о «Небезопасные операции»?
Вопрос 5 из 30
Что именно подтверждает проверка с `Box::new`?
RustRust · Сырые указатели
let dangling = {
    let x = Box::new(7i32);
    Box::into_raw(x)
};
unsafe { drop(Box::from_raw(dangling)); }
Вопрос 6 из 30
Какой край контракта «Безопасность и производительность» чаще всего остаётся незамеченным?
Вопрос 7 из 30
Какое правило Rust точнее всего описывает механизм «Безопасность и производительность»?
Вопрос 8 из 30
Как правильно прочитать результат диагностического сценария `raw_roundtrip_once`?
RustRust · Тестирование и инструменты Cargo
#[test]
fn raw_roundtrip_once() {
    let raw = Box::into_raw(Box::new(String::from("x")));
    unsafe {
        let owned = Box::from_raw(raw);
        assert_eq!(&*owned, "x");
    }
}
Вопрос 9 из 30
На какое правило следует опираться при ревью кода по теме «Тестирование и инструменты Cargo» в контексте «unsafe Rust»?
Вопрос 10 из 30
Как Rust выполнит этот фрагмент о механизме «Сырые указатели»?
RustRust · Сырые указатели
let mut value = 10;
let p = &mut value as *mut i32;
unsafe { *p += 5; }
println!("{value}");
Вопрос 11 из 30
Как переписать код с `&mut`, не ослабляя контракт «Сырые указатели»?
RustRust · Сырые указатели
let mut value = 10;
let p = &mut value as *mut i32;
unsafe { *p += 5; }
println!("{value}");
Вопрос 12 из 30
Что устанавливает сценарий `get_unchecked` и где проходит граница его вывода?
RustRust · Безопасность и производительность
fn first_unchecked(xs: &[u32]) -> u32 {
    unsafe { *xs.get_unchecked(0) }
}

# criterion-подобный benchmark: safe first после if !xs.is_empty() против get_unchecked
# отдельно cargo asm для сравнения машинного кода
Вопрос 13 из 30
Как лучше всего описать гарантию механизма «Инварианты»?
Вопрос 14 из 30
Что нужно изменить вокруг `unsafe`, чтобы устранить первопричину?
RustRust · Небезопасные операции
unsafe fn read(ptr: *const i32) -> i32 {
    unsafe { *ptr }
}
Вопрос 15 из 30
Какие значения останутся доступными после `get_unchecked`?
RustRust · Инварианты
struct NonEmpty(Vec<u8>);
impl NonEmpty {
    fn first(&self) -> u8 { unsafe { *self.0.get_unchecked(0) } }
}
Вопрос 16 из 30
Как переработать участок с `get_unchecked`, сохранив требуемое поведение?
RustRust · Безопасность и производительность
fn first_unchecked(xs: &[u32]) -> u32 {
    unsafe { *xs.get_unchecked(0) }
}
Вопрос 17 из 30
Какое условие способно превратить рабочий пример «Безопасная оболочка» в ошибочный?
Вопрос 18 из 30
Что можно считать доказанным после успешного выполнения `is_empty`?
RustRust · Инварианты
impl NonEmpty {
    fn new(v: Vec<u8>) -> Option<Self> { (!v.is_empty()).then_some(Self(v)) }
}
Вопрос 19 из 30
Как правильно прочитать результат диагностического сценария `read`?
RustRust · Небезопасные операции
/// # Safety
/// ptr must be non-null, aligned, and point to an initialized i32 valid for reads.
unsafe fn checked_contract(ptr: *const i32) -> i32 { unsafe { ptr.read() } }
Вопрос 20 из 30
Как Rust выполнит этот фрагмент о механизме «Небезопасные операции»?
RustRust · Небезопасные операции
unsafe fn read(ptr: *const i32) -> i32 {
    unsafe { *ptr }
}
Вопрос 21 из 30
Какая правка выдержит ревью контракта «Инварианты»?
RustRust · Инварианты
struct NonEmpty(Vec<u8>);
impl NonEmpty {
    fn first(&self) -> u8 { unsafe { *self.0.get_unchecked(0) } }
}
Вопрос 22 из 30
Чем завершится выполнение фрагмента с `std::slice::from_raw_parts_mut`?
RustRust · Безопасная оболочка
pub fn split_at_mut<T>(slice: &mut [T], mid: usize) -> (&mut [T], &mut [T]) {
    assert!(mid <= slice.len());
    let ptr = slice.as_mut_ptr();
    unsafe {
        (std::slice::from_raw_parts_mut(ptr, mid),
         std::slice::from_raw_parts_mut(ptr.add(mid), slice.len() - mid))
    }
}
Вопрос 23 из 30
Какое утверждение о «Небезопасные операции» остаётся верным при смене входных данных?
Вопрос 24 из 30
Какое объяснение механизма «Сырые указатели» не смешивает компиляцию и выполнение?
Вопрос 25 из 30
Какой принцип лежит в основе механизма «Безопасная оболочка»?
Вопрос 26 из 30
Какой рефакторинг исправляет причину сбоя возле `std::slice::from_raw_parts_mut`?
RustRust · Безопасная оболочка
pub fn split_at_mut<T>(slice: &mut [T], mid: usize) -> (&mut [T], &mut [T]) {
    assert!(mid <= slice.len());
    let ptr = slice.as_mut_ptr();
    unsafe {
        (std::slice::from_raw_parts_mut(ptr, mid),
         std::slice::from_raw_parts_mut(ptr.add(mid), slice.len() - mid))
    }
}
Вопрос 27 из 30
Что можно считать доказанным после успешного выполнения `raw_roundtrip_once`?
RustRust · Тестирование и инструменты Cargo
#[test]
fn raw_roundtrip_once() {
    let raw = Box::into_raw(Box::new(String::from("x")));
    unsafe {
        let owned = Box::from_raw(raw);
        assert_eq!(&*owned, "x");
    }
}

# cargo +nightly miri test raw_roundtrip_once
Вопрос 28 из 30
Как привести работу с `raw_roundtrip_once` в соответствие с правилами Rust?
RustRust · Тестирование и инструменты Cargo
#[test]
fn raw_roundtrip_once() {
    let raw = Box::into_raw(Box::new(String::from("x")));
    unsafe {
        let owned = Box::from_raw(raw);
        assert_eq!(&*owned, "x");
    }
}
Вопрос 29 из 30
Как следует интерпретировать результат проверки `&mut`?
RustRust · Безопасная оболочка
let mut data = [1, 2, 3, 4];
let (a, b) = split_at_mut(&mut data, 2);
a[0] = 9; b[0] = 8;
assert_eq!(data, [9, 2, 8, 4]);
Вопрос 30 из 30
Как следует оценить этот `unsafe`-фрагмент?
RustRust · Безопасность и производительность
fn first_unchecked(xs: &[u32]) -> u32 {
    unsafe { *xs.get_unchecked(0) }
}

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe)

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу