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

Аудит unsafe-кода и производственного сбоя

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

Отвечено: 0 из 30
--:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат, результаты по 6 тематическим шкалам и подробные объяснения.
Вопрос 1 из 30
Какое изменение окружения может повлиять на вывод о «Модель инвариантов»?
Вопрос 2 из 30
Какой принцип лежит в основе механизма «Miri и санитайзеры»?
Вопрос 3 из 30
Какое изменение окружения может повлиять на вывод о «Miri и санитайзеры»?
Вопрос 4 из 30
Какой граничный случай важнее всего учесть для механизма «Безопасность и производительность»?
Вопрос 5 из 30
Что именно стало проверяемым благодаря сценарию `overlapping_mut_refs`?
RustRust · Miri и санитайзеры
#[test]
fn overlapping_mut_refs() {
    let mut x = 0;
    let p = &mut x as *mut i32;
    unsafe {
        let a = &mut *p;
        let b = &mut *p;
        *a += 1;
        *b += 1;
    }
}
Вопрос 6 из 30
Какая правка выдержит ревью контракта «Профилирование»?
ТекстКонфигурация или диагностика · Профилирование
# Симптом: p99 вырос с 20 до 900 мс, CPU 100%, allocations/s выросли в 30 раз.
# flamegraph: hot path -> decode -> Vec::clone -> memcpy.
Вопрос 7 из 30
Где заканчивается гарантия обычного сценария для «Безопасное исправление»?
Вопрос 8 из 30
Что ещё нужно проверить, прежде чем считать реализацию «Профилирование» надёжной?
Вопрос 9 из 30
Что можно считать доказанным после успешного выполнения `overlapping_mut_refs`?
RustRust · Miri и санитайзеры
#[test]
fn overlapping_mut_refs() {
    let mut x = 0;
    let p = &mut x as *mut i32;
    unsafe {
        let a = &mut *p;
        let b = &mut *p;
        *a += 1;
        *b += 1;
    }
}

# cargo +nightly miri test overlapping_mut_refs
# RUSTFLAGS="-Zsanitizer=thread" cargo +nightly test --target <supported-target>
Вопрос 10 из 30
Как сформулировать контракт механизма «Безопасность и производительность» без привязки к именам переменных?
Вопрос 11 из 30
Какой вывод о механизме «Модель инвариантов» соответствует модели Rust?
Вопрос 12 из 30
Какое свойство закрепляет сценарий `drop_each_initialized_element_once`?
RustRust · Тестирование и инструменты Cargo
#[test]
fn drop_each_initialized_element_once() {
    let drops = std::sync::Arc::new(std::sync::atomic::AtomicUsize::new(0));
    // заполнить структуру Guard-элементами, вызвать ошибочный путь и удалить контейнер
    // assert_eq!(drops.load(...), inserted);
}

# cargo +nightly miri test drop_each_initialized_element_once
# cargo test incident_regression -- --exact
Вопрос 13 из 30
Какой принцип Rust объясняет обычный сценарий для «Безопасное исправление»?
Вопрос 14 из 30
Какой край контракта «Тестирование и инструменты Cargo» чаще всего остаётся незамеченным в контексте «Аудит unsafe-кода и производственного сбоя»?
Вопрос 15 из 30
Что можно считать доказанным после успешного выполнения `Vec::clone`?
ТекстКонфигурация или диагностика · Профилирование
# Симптом: p99 вырос с 20 до 900 мс, CPU 100%, allocations/s выросли в 30 раз.
# flamegraph: hot path -> decode -> Vec::clone -> memcpy.

# После патча: allocations/s вернулись к базе, p99 28 мс, машинный профиль больше не содержит Vec::clone.
Вопрос 16 из 30
Какую регрессию должен ловить `try_reserve`?
RustRust · Безопасность и производительность
let old = vec.len();
vec.try_reserve(additional)?;
vec.resize(old + additional, 0);
Вопрос 17 из 30
Что именно подтверждает эта проверка механизма «Безопасное исправление»?
RustRust · Безопасное исправление
assert!(container.get(container.len()).is_none());
Вопрос 18 из 30
Какой дефект способен воспроизвести тест `unsafe`?
RustRust · Модель инвариантов
# Проверка состояния перед unsafe чтением:
assert!(ring.len <= ring.cap);
assert!(ring.cap == 0 || ring.head < ring.cap);
Вопрос 19 из 30
Почему у программы нет гарантированного результата?
RustRust · Безопасное исправление
pub fn get(&self, index: usize) -> &T {
    unsafe { self.slice.get_unchecked(index) }
}
Вопрос 20 из 30
Как устранить причину диагностики в строке с `std::ptr::NonNull`?
RustRust · Модель инвариантов
struct Ring {
    ptr: std::ptr::NonNull<u8>,
    cap: usize,
    head: usize,
    len: usize,
}
Вопрос 21 из 30
Как убрать источник проблемы в коде с `set_len`?
RustRust · Безопасность и производительность
unsafe fn reserve_unchecked(vec: &mut Vec<u8>, additional: usize) {
    let new_len = vec.len() + additional;
    vec.set_len(new_len);
}
Вопрос 22 из 30
Как изменить фрагмент с `overlapping_mut_refs`, чтобы дефект не повторился?
RustRust · Miri и санитайзеры
#[test]
fn overlapping_mut_refs() {
    let mut x = 0;
    let p = &mut x as *mut i32;
    unsafe {
        let a = &mut *p;
        let b = &mut *p;
        *a += 1;
        *b += 1;
    }
}
Вопрос 23 из 30
Как обновить фрагмент с `get_unchecked`, чтобы ошибка исчезла по существу?
RustRust · Безопасное исправление
pub fn get(&self, index: usize) -> &T {
    unsafe { self.slice.get_unchecked(index) }
}
Вопрос 24 из 30
Каков конечный результат операции `set_len`?
RustRust · Безопасность и производительность
unsafe fn reserve_unchecked(vec: &mut Vec<u8>, additional: usize) {
    let new_len = vec.len() + additional;
    vec.set_len(new_len);
}
Вопрос 25 из 30
Что исправить вокруг `drop_each_initialized_element_once`, чтобы граничный вход обрабатывался безопасно?
RustRust · Тестирование и инструменты Cargo
#[test]
fn drop_each_initialized_element_once() {
    let drops = std::sync::Arc::new(std::sync::atomic::AtomicUsize::new(0));
    // заполнить структуру Guard-элементами, вызвать ошибочный путь и удалить контейнер
    // assert_eq!(drops.load(...), inserted);
}
Вопрос 26 из 30
Какой вывод о механизме «Профилирование» соответствует модели Rust?
Вопрос 27 из 30
Как завершится обычная ветвь выполнения после `std::ptr::NonNull`?
RustRust · Модель инвариантов
struct Ring {
    ptr: std::ptr::NonNull<u8>,
    cap: usize,
    head: usize,
    len: usize,
}
Вопрос 28 из 30
Как изменится состояние программы после `Vec::clone`?
ТекстКонфигурация или диагностика · Профилирование
# Симптом: p99 вырос с 20 до 900 мс, CPU 100%, allocations/s выросли в 30 раз.
# flamegraph: hot path -> decode -> Vec::clone -> memcpy.
Вопрос 29 из 30
Какое правило Rust точнее всего описывает механизм «Тестирование и инструменты Cargo» в контексте «Аудит unsafe-кода и производственного сбоя»?
Вопрос 30 из 30
На какую часть контракта распространяется проверка `drop_each_initialized_element_once`?
RustRust · Тестирование и инструменты Cargo
#[test]
fn drop_each_initialized_element_once() {
    let drops = std::sync::Arc::new(std::sync::atomic::AtomicUsize::new(0));
    // заполнить структуру Guard-элементами, вызвать ошибочный путь и удалить контейнер
    // assert_eq!(drops.load(...), inserted);
}

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

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

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

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