💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат, результаты по 6 тематическим шкалам и подробные объяснения.
Вопрос 26 из 30
Что именно стало проверяемым благодаря сценарию `std::marker::PhantomPinned`?
Rust Rust · Безопасность и производительность Копировать
struct Task {
buffer: Vec<u8>,
ptr: *const u8,
_pin: std::marker::PhantomPinned,
}
# Профиль: падение после push, адрес buffer.as_ptr() изменился.
Если сценарий проходит в debug-сборке, в release и на другой целевой платформе результат будет тем же.
Изменение адреса буфера объясняет висячий ptr даже при закреплённом Task; проблема не решается одним Pin<Box<Task>>.
Проверка подтверждает производительность решения, даже если в ней нет измерения времени, памяти или аллокаций; результат проверки с `Task` предлагается переносить на все остальные ветви.
Диагностика инструмента сама однозначно подсказывает безопасное исправление, поэтому разбирать контракт отдельно не нужно.
Результат можно считать доказательством свойства языка, даже если он зависит от конкретной библиотеки или платформы. Следовательно, для `as_ptr` не понадобилось бы явное предусловие.
Вопрос 27 из 30
Как изменить фрагмент с `std::marker::PhantomPinned`, чтобы дефект не повторился?
Rust Rust · Безопасность и производительность Копировать
struct Task {
buffer: Vec<u8>,
ptr: *const u8,
_pin: std::marker::PhantomPinned,
}
Закрепить значение рядом с `Task` через небезопасный `Pin::new_unchecked`, не доказывая, что дальнейшие методы не перемещают данные этого фрагмента.
Не хранить сырой указатель в Vec, который может менять ёмкость; использовать индекс, стабильное выделение Box<[u8]> или запретить операции перераспределения отдельным типом.
Вызвать блокирующий `block_on` или синхронное ожидание внутри исполнителя рядом с `Task`. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым.
Spawn каждую мелкую операцию отдельно и не хранить JoinHandle или протокол отмены. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым.
Удерживать синхронный guard или другую блокировку через `Task`, полагаясь на короткое время ожидания. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым.