💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат, результаты по 6 тематическим шкалам и подробные объяснения.
Вопрос 7 из 30
Как изменить этот фрагмент, не создавая лишнего владельца данных?
Rust Rust · Выравнивание Копировать
#[repr(C)]
struct A { flag: u8, value: u64 }
println!("{} {}", std::mem::size_of::<A>(), std::mem::align_of::<A>());
Считать layout вокруг `repr` на текущей цели стабильным ABI-контрактом и удалить явные проверки границы «Выравнивание».
Подавить сообщение Miri или санитайзера для `repr`, если обычный тест не воспроизводит сбой. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым.
Расширить `unsafe`-блок вокруг `repr` до всей функции, оставив инварианты данные этого фрагмента неоформленными.
Переставлять поля ради плотности только если внешний layout не зафиксирован и измерение показывает смысл; не читать padding как инициализированные данные.
Использовать `transmute` для данных рядом с `repr`, не проверяя размер, выравнивание и допустимые значения. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым.
Вопрос 16 из 30
Как обновить фрагмент с `#[repr(packed)]`, чтобы ошибка исчезла по существу?
Rust Rust · Безопасность и производительность Копировать
#[repr(packed)]
struct Packet { tag: u8, value: u32 }
let packet = Packet { tag: 1, value: 7 };
// let r = &packet.value;
Расширить `unsafe`-блок вокруг `repr` до всей функции, оставив инварианты данные этого фрагмента неоформленными. Проверка инварианта при этом переходит из системы типов в ручную обязанность автора кода.
Использовать `transmute` для данных рядом с `repr`, не проверяя размер, выравнивание и допустимые значения. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым. Поэтому ошибочный сценарий вокруг `#[repr(packed)]` не проверяли бы отдельно.
Избегать repr(packed) в обычной модели; для wire-формата разбирать байты явно, а при необходимости unsafe использовать read_unaligned без формирования невыравненной ссылки.
Подавить сообщение Miri или санитайзера для `repr`, если обычный тест не воспроизводит сбой. Сигнатура при этом почти не меняется, однако исходное предусловие остаётся скрытым. Контракт `#[repr(packed)]` считался бы одинаковым при любом состоянии входа.
Считать layout вокруг `repr` на текущей цели стабильным ABI-контрактом и удалить явные проверки границы «Безопасность и производительность».