💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат, результаты по 6 тематическим шкалам и подробные объяснения.
Вопрос 6 из 30
Какая правка выдержит ревью контракта «Профилирование»?
Текст Конфигурация или диагностика · Профилирование Копировать
# Симптом: p99 вырос с 20 до 900 мс, CPU 100%, allocations/s выросли в 30 раз.
# flamegraph: hot path -> decode -> Vec::clone -> memcpy.
Считать layout вокруг `p99` на текущей цели стабильным ABI-контрактом и удалить явные проверки границы «Профилирование». Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым.
Подавить сообщение Miri или санитайзера для `p99`, если обычный тест не воспроизводит сбой. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым.
Сначала устранить лишнее clone через заимствование или перенос владения, затем повторить профиль на том же workload; unsafe-микрооптимизацию рассматривать только после этого.
Расширить `unsafe`-блок вокруг `p99` до всей функции, оставив инварианты данные этого фрагмента неоформленными. Проверка инварианта при этом переходит из системы типов в ручную обязанность автора кода.
Использовать `transmute` для данных рядом с `p99`, не проверяя размер, выравнивание и допустимые значения. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым.
Вопрос 20 из 30
Как устранить причину диагностики в строке с `std::ptr::NonNull`?
Rust Rust · Модель инвариантов Копировать
struct Ring {
ptr: std::ptr::NonNull<u8>,
cap: usize,
head: usize,
len: usize,
}
Считать layout вокруг `Ring` на текущей цели стабильным ABI-контрактом и удалить явные проверки границы «Модель инвариантов».
Расширить `unsafe`-блок вокруг `Ring` до всей функции, оставив инварианты данные этого фрагмента неоформленными.
Подавить сообщение Miri или санитайзера для `Ring`, если обычный тест не воспроизводит сбой. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым.
Записать инварианты до чтения unsafe-методов, сопоставить каждый публичный переход с сохранением условий и отдельно разобрать пустое состояние cap == 0.
Использовать `transmute` для данных рядом с `Ring`, не проверяя размер, выравнивание и допустимые значения.
Вопрос 25 из 30
Что исправить вокруг `drop_each_initialized_element_once`, чтобы граничный вход обрабатывался безопасно?
Rust Rust · Тестирование и инструменты 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);
}
Использовать `transmute` для данных рядом с `drop_each_initialized_element_once`, не проверяя размер, выравнивание и допустимые значения.
Добавить граничные длины, panic-injection, fuzzing последовательностей операций, Miri и санитайзеры; регрессионный тест обязан воспроизводить исходный путь сбоя.
Расширить `unsafe`-блок вокруг `drop_each_initialized_element_once` до всей функции, оставив инварианты данные этого фрагмента неоформленными.
Подавить сообщение Miri или санитайзера для `drop_each_initialized_element_once`, если обычный тест не воспроизводит сбой.
Считать layout вокруг `drop_each_initialized_element_once` на текущей цели стабильным ABI-контрактом и удалить явные проверки границы «Тестирование и инструменты Cargo».
Вопрос 27 из 30
Как завершится обычная ветвь выполнения после `std::ptr::NonNull`?
Rust Rust · Модель инвариантов Копировать
struct Ring {
ptr: std::ptr::NonNull<u8>,
cap: usize,
head: usize,
len: usize,
}
Для безопасности нужно явно зафиксировать: выделение живо и соответствует cap, head < cap при cap > 0, len <= cap, а инициализированные элементы определяются head и len без двойного Drop.
Ошибка возникнет на этапе компиляции: `extern`-блок редакции 2024 помечен unsafe. До последней строки и наблюдаемого результата программа при таком разборе не доходит.
Такая запись допустима, так как `unsafe`-блок проверяет валидность указателя перед разыменованием. Значит, выполнение должно пройти через `std::ptr::NonNull` без изменения сигнатуры.
Код компилируется, но невалидный указатель всегда вызывает контролируемую panic до чтения памяти. Значит, выполнение должно пройти через `std::ptr::NonNull` без изменения сигнатуры.
Код компилируется, но miri автоматически исправляет нарушение aliasing и продолжает тест. Значит, выполнение должно пройти через `std::ptr::NonNull` без изменения сигнатуры.