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