Rust-ffi-omnibus: 安全でない機能と安全でないブロック

作成日 2016年08月26日  ·  3コメント  ·  ソース: shepmaster/rust-ffi-omnibus

このような場所で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をコーディングしているので、このシナリオでどちらかを選択する特別な理由がある場合は、たださまよっています。

enhancement help wanted

最も参考になるコメント

確認した結果、安全を確保する責任があることを発信者に示すために、関数にunsafeマークを付ける方が正しいと思います。 安全でないfnが安全でないブロックを意味しないようにするRFC2585unsafe 、その余分なunsafeブロックが警告をトリガーします。

RFCが受け入れられ、警告を無視することで今日これらの標準にコーディングしようと試みる可能性がありますが、それは脆弱な道です。

全てのコメント3件

良い質問です! 私の考えは、 unsafeブロックがそれらを「安全」にするものについてのドキュメントを提供するという事実に関するものでした。 ポインタを介して間違ったタイプを渡すことについてのあなたのポイントは、その中に穴を開けます(私はそれを回避する方法はわかりませんが)。

関数全体をunsafeとしてマークすることは、対称性の観点からはちょっといいです-Cから_imported_された関数は当然unsafeです。 決定に役立ついくつかの視点をどこで得ることができるのだろうか...

関数全体をunsafeとしてマークします。 安全性がユーザー入力に依存している場合は、 unsafeです。 unsafeとしてマークしないことは、それを使用することを検討している開発者にとって虚偽の宣伝のように感じます。 (これは、FFIバインディングを必要とする最近のプロジェクトで、非Rust言語でバインディングを記述し、それらのバインディングを介したRustライブラリの使用のみをサポートする理由の一部です。この場合、「セーフモジュール」はFFI全体に拡張されます。境界。)

確認した結果、安全を確保する責任があることを発信者に示すために、関数にunsafeマークを付ける方が正しいと思います。 安全でないfnが安全でないブロックを意味しないようにするRFC2585unsafe 、その余分なunsafeブロックが警告をトリガーします。

RFCが受け入れられ、警告を無視することで今日これらの標準にコーディングしようと試みる可能性がありますが、それは脆弱な道です。

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

dmwyatt picture dmwyatt  ·  3コメント

mollieru picture mollieru  ·  3コメント

ghost picture ghost  ·  3コメント

adinriv picture adinriv  ·  3コメント

LioMajor picture LioMajor  ·  3コメント