Есть ли какая-то особая причина, по которой вы используете 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, поэтому просто блуждаю, если есть какая-то особая причина выбрать один из них в этом сценарии.
Хороший вопрос ! Я думал о том, что блоки unsafe
предоставляют документацию о том, что делает их «безопасными». Ваша точка зрения о передаче неправильного типа через указатель пробивает дыру в этом (хотя я не вижу никакого способа обойти это).
Пометка всей функции как unsafe
довольно приятна с точки зрения симметрии - функции, импортированные из C, естественно, являются unsafe
. Интересно, где мы можем получить еще несколько точек зрения, чтобы помочь решить ...
Я за то, чтобы обозначить всю функцию как unsafe
. Если безопасность зависит от ввода данных пользователем, то это unsafe
. Отсутствие пометки как unsafe
выглядит как ложная реклама для разработчика, рассматривающего возможность его использования. (Это отчасти объясняет, почему в недавних проектах, требующих привязки FFI, я пишу привязки на языке, отличном от Rust, и поддерживаю использование библиотеки Rust только через эти привязки. «Безопасный модуль» в этом случае распространяется на FFI граница.)
После проверки я думаю, что правильнее иметь функцию, помеченную как unsafe
чтобы указать вызывающим абонентам, что они несут ответственность за обеспечение безопасности. Предлагается RFC 2585 , который сделает так, чтобы небезопасный fn не подразумевал небезопасный блок, что, однако, сделало бы меня намного более счастливым от такого изменения. Прямо сейчас небезопасность может быть "ограничена" несколькими строками, но когда вы выполняете функцию unsafe
, этот дополнительный блок unsafe
вызовет предупреждение.
Мы могли бы предположить, что RFC будет принят, и попытаемся кодировать в соответствии с этими стандартами сегодня, игнорируя предупреждение, но это хрупкий путь.
Самый полезный комментарий
После проверки я думаю, что правильнее иметь функцию, помеченную как
unsafe
чтобы указать вызывающим абонентам, что они несут ответственность за обеспечение безопасности. Предлагается RFC 2585 , который сделает так, чтобы небезопасный fn не подразумевал небезопасный блок, что, однако, сделало бы меня намного более счастливым от такого изменения. Прямо сейчас небезопасность может быть "ограничена" несколькими строками, но когда вы выполняете функциюunsafe
, этот дополнительный блокunsafe
вызовет предупреждение.Мы могли бы предположить, что RFC будет принят, и попытаемся кодировать в соответствии с этими стандартами сегодня, игнорируя предупреждение, но это хрупкий путь.