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

FFI и взаимодействие с C

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

Отвечено: 0 из 30
--:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат, результаты по 6 тематическим шкалам и подробные объяснения.
Вопрос 1 из 30
Какой узкий вывод следует из проверки `std::mem::forget`?
RustRust · Владение на границе
let mut v = vec![1u8, 2, 3];
let buf = Buffer { ptr: v.as_mut_ptr(), len: v.len(), cap: v.capacity() };
std::mem::forget(v);
// позже ровно один Vec::from_raw_parts(buf.ptr, buf.len, buf.cap)
Вопрос 2 из 30
Какой дефект способен воспроизвести тест `size_of`?
RustRust · Представление типов
assert_eq!(std::mem::size_of::<Point>(), 8);
assert_eq!(std::mem::align_of::<Point>(), 4);
Вопрос 3 из 30
Какое утверждение о «Владение на границе» остаётся верным при смене входных данных?
Вопрос 4 из 30
Где заканчивается гарантия обычного сценария для «Владение на границе»?
Вопрос 5 из 30
Какая правка выдержит ревью контракта «Соглашение вызова ABI»?
RustRust · Соглашение вызова ABI
extern "C" fn add(a: i32, b: i32) -> i32 { a + b }
let f: extern "C" fn(i32, i32) -> i32 = add;
println!("{}", f(2, 3));
Вопрос 6 из 30
Какая правка выдержит ревью контракта «Безопасность и производительность»?
RustRust · Безопасность и производительность
extern "C" fn callback(data: *const u8, len: usize) {
    let bytes = unsafe { std::slice::from_raw_parts(data, len) };
    process(bytes);
}
Вопрос 7 из 30
Где заканчивается гарантия обычного сценария для «Соглашение вызова ABI»?
Вопрос 8 из 30
Какое утверждение о механизме «Внешние функции extern» можно переносить на другие примеры?
Вопрос 9 из 30
Что произойдёт после операции `extern "C"`?
RustRust · Безопасность и производительность
extern "C" fn callback(data: *const u8, len: usize) {
    let bytes = unsafe { std::slice::from_raw_parts(data, len) };
    process(bytes);
}
Вопрос 10 из 30
Что устанавливает сценарий `extern "C"` и где проходит граница его вывода?
RustRust · Безопасность и производительность
extern "C" fn callback(data: *const u8, len: usize) {
    let bytes = unsafe { std::slice::from_raw_parts(data, len) };
    process(bytes);
}

# Инцидент: C передал data = NULL, len = 0; from_raw_parts всё равно требует non-null aligned pointer.
Вопрос 11 из 30
Что показывает `c_string_rejects_inner_nul` применительно к механизму «Тестирование и инструменты Cargo»?
RustRust · Тестирование и инструменты Cargo
#[test]
fn c_string_rejects_inner_nul() {
    assert!(std::ffi::CString::new(b"a\0b".to_vec()).is_err());
}
Вопрос 12 из 30
Какое правило связывает типы и наблюдаемое поведение в механизме «Представление типов»?
Вопрос 13 из 30
Как проявится механизм «Соглашение вызова ABI» при выполнении кода?
RustRust · Соглашение вызова ABI
extern "C" fn add(a: i32, b: i32) -> i32 { a + b }
let f: extern "C" fn(i32, i32) -> i32 = add;
println!("{}", f(2, 3));
Вопрос 14 из 30
Что исправить вокруг `#[repr(C)]`, чтобы граничный вход обрабатывался безопасно?
RustRust · Представление типов
#[repr(C)]
struct Point { x: i32, y: i32 }
Вопрос 15 из 30
На какую часть контракта распространяется проверка `std::panic::catch_unwind`?
RustRust · Соглашение вызова ABI
let result = std::panic::catch_unwind(|| add(1, 2));
assert_eq!(result.unwrap(), 3);
Вопрос 16 из 30
Какой результат даст этот фрагмент с `#[repr(C)]`?
RustRust · Представление типов
#[repr(C)]
struct Point { x: i32, y: i32 }
Вопрос 17 из 30
Как проявится механизм «Владение на границе» при выполнении кода?
RustRust · Владение на границе
#[repr(C)]
struct Buffer { ptr: *mut u8, len: usize, cap: usize }
Вопрос 18 из 30
Какое изменение входа способно поменять вывод о механизме «Безопасность и производительность»?
Вопрос 19 из 30
Что нужно изменить вокруг `#[repr(C)]`, чтобы устранить первопричину?
RustRust · Владение на границе
#[repr(C)]
struct Buffer { ptr: *mut u8, len: usize, cap: usize }
Вопрос 20 из 30
Какое предусловие «Тестирование и инструменты Cargo» необходимо записать явно?
Вопрос 21 из 30
Как лучше всего описать гарантию механизма «Безопасность и производительность»?
Вопрос 22 из 30
На какое правило следует опираться при ревью кода по теме «Тестирование и инструменты Cargo»?
Вопрос 23 из 30
Какой вывод допустим после запуска `c_string_rejects_inner_nul` и чего он не доказывает?
RustRust · Тестирование и инструменты Cargo
#[test]
fn c_string_rejects_inner_nul() {
    assert!(std::ffi::CString::new(b"a\0b".to_vec()).is_err());
}

# cargo test --test ffi_roundtrip
# RUSTFLAGS="-Zsanitizer=address" cargo +nightly test --target <supported-target>
Вопрос 24 из 30
Какая правка выдержит ревью контракта «Тестирование и инструменты Cargo»?
RustRust · Тестирование и инструменты Cargo
#[test]
fn c_string_rejects_inner_nul() {
    assert!(std::ffi::CString::new(b"a\0b".to_vec()).is_err());
}
Вопрос 25 из 30
Какой риск остаётся после успешной компиляции кода по теме «Внешние функции extern»?
Вопрос 26 из 30
Что должно войти в отрицательный тест механизма «Представление типов»?
Вопрос 27 из 30
Каков конечный результат операции `unsafe extern "C"`?
RustRust · Внешние функции extern
unsafe extern "C" {
    fn strlen(s: *const std::ffi::c_char) -> usize;
}
Вопрос 28 из 30
Какой рефакторинг исправляет причину сбоя возле `unsafe extern "C"`?
RustRust · Внешние функции extern
unsafe extern "C" {
    fn strlen(s: *const std::ffi::c_char) -> usize;
}
Вопрос 29 из 30
Что показывает `std::ffi::CString::new` применительно к механизму «Внешние функции extern»?
RustRust · Внешние функции extern
let s = std::ffi::CString::new("rust").unwrap();
let n = unsafe { strlen(s.as_ptr()) };
assert_eq!(n, 4);
Вопрос 30 из 30
Какой принцип лежит в основе механизма «Соглашение вызова ABI»?

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

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

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

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