このような場所でunsafe
関数ではなく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から_imported_された関数は当然unsafe
です。 決定に役立ついくつかの視点をどこで得ることができるのだろうか...
関数全体をunsafe
としてマークします。 安全性がユーザー入力に依存している場合は、 unsafe
です。 unsafe
としてマークしないことは、それを使用することを検討している開発者にとって虚偽の宣伝のように感じます。 (これは、FFIバインディングを必要とする最近のプロジェクトで、非Rust言語でバインディングを記述し、それらのバインディングを介したRustライブラリの使用のみをサポートする理由の一部です。この場合、「セーフモジュール」はFFI全体に拡張されます。境界。)
確認した結果、安全を確保する責任があることを発信者に示すために、関数にunsafe
マークを付ける方が正しいと思います。 安全でないfnが安全でないブロックを意味しないようにするRFC2585がunsafe
、その余分なunsafe
ブロックが警告をトリガーします。
RFCが受け入れられ、警告を無視することで今日これらの標準にコーディングしようと試みる可能性がありますが、それは脆弱な道です。
最も参考になるコメント
確認した結果、安全を確保する責任があることを発信者に示すために、関数に
unsafe
マークを付ける方が正しいと思います。 安全でないfnが安全でないブロックを意味しないようにするRFC2585がunsafe
、その余分なunsafe
ブロックが警告をトリガーします。RFCが受け入れられ、警告を無視することで今日これらの標準にコーディングしようと試みる可能性がありますが、それは脆弱な道です。