Rust-ffi-omnibus: Небезопасные функции против небезопасных блоков

Созданный на 26 авг. 2016  ·  3Комментарии  ·  Источник: shepmaster/rust-ffi-omnibus

Есть ли какая-то особая причина, по которой вы используете unsafe block вместо unsafe функций в подобных местах ?

Разве не было бы лучше / точнее написать это как:

#[no_mangle]
pub unsafe extern fn zip_code_database_population_of(ptr: *const ZipCodeDatabase, zip: *const c_char) -> uint32_t {

и удалить блоки unsafe внутри?

Это указывает на то, что ptr может быть чем-то неподдающимся проверке - например, вы можете даже указать что-то, что указывает на что-то другое, кроме ZipCodeDatabase (совершенно другой объект / макет памяти), в этом случае это UB и так далее и так далее.

Я сам кодирую FFI, поэтому просто блуждаю, если есть какая-то особая причина выбрать один из них в этом сценарии.

enhancement help wanted

Самый полезный комментарий

После проверки я думаю, что правильнее иметь функцию, помеченную как unsafe чтобы указать вызывающим абонентам, что они несут ответственность за обеспечение безопасности. Предлагается RFC 2585 , который сделает так, чтобы небезопасный fn не подразумевал небезопасный блок, что, однако, сделало бы меня намного более счастливым от такого изменения. Прямо сейчас небезопасность может быть "ограничена" несколькими строками, но когда вы выполняете функцию unsafe , этот дополнительный блок unsafe вызовет предупреждение.

Мы могли бы предположить, что RFC будет принят, и попытаемся кодировать в соответствии с этими стандартами сегодня, игнорируя предупреждение, но это хрупкий путь.

Все 3 Комментарий

Хороший вопрос ! Я думал о том, что блоки unsafe предоставляют документацию о том, что делает их «безопасными». Ваша точка зрения о передаче неправильного типа через указатель пробивает дыру в этом (хотя я не вижу никакого способа обойти это).

Пометка всей функции как unsafe довольно приятна с точки зрения симметрии - функции, импортированные из C, естественно, являются unsafe . Интересно, где мы можем получить еще несколько точек зрения, чтобы помочь решить ...

Я за то, чтобы обозначить всю функцию как unsafe . Если безопасность зависит от ввода данных пользователем, то это unsafe . Отсутствие пометки как unsafe выглядит как ложная реклама для разработчика, рассматривающего возможность его использования. (Это отчасти объясняет, почему в недавних проектах, требующих привязки FFI, я пишу привязки на языке, отличном от Rust, и поддерживаю использование библиотеки Rust только через эти привязки. «Безопасный модуль» в этом случае распространяется на FFI граница.)

После проверки я думаю, что правильнее иметь функцию, помеченную как unsafe чтобы указать вызывающим абонентам, что они несут ответственность за обеспечение безопасности. Предлагается RFC 2585 , который сделает так, чтобы небезопасный fn не подразумевал небезопасный блок, что, однако, сделало бы меня намного более счастливым от такого изменения. Прямо сейчас небезопасность может быть "ограничена" несколькими строками, но когда вы выполняете функцию unsafe , этот дополнительный блок unsafe вызовет предупреждение.

Мы могли бы предположить, что RFC будет принят, и попытаемся кодировать в соответствии с этими стандартами сегодня, игнорируя предупреждение, но это хрупкий путь.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги