unsafe キーワードには 2 つの役割があります

  1. 安全性に関する配慮が必要な API を 作成する

    • unsafe 関数: unsafe fn get_unchecked(&self) { ... }
    • unsafe トレイト: unsafe trait Send {}
  2. 安全性に関する配慮が必要な API を 使用する

    • 組み込みの unsafe 演算子を呼び出す: unsafe { *ptr }
    • unsafe 関数を呼び出す: unsafe { x.get_unchecked() }
    • unsafe トレイトを実装する: unsafe impl Send for Counter {}

2 つの役割:

  1. 安全性に関する配慮が必要な API を 作成 し、何に配慮する必要があるかを 定義する
  2. 安全性に関する配慮が必要な API を 使用 し、その配慮がなされていることを 確認する

安全性に関する配慮が必要な API を作成する

「まず、unsafe キーワードを使うと、Rust の安全性保証を破る可能性がある API を 作成できます。具体的には、unsafe 関数と unsafe トレイトを定義するときに、 unsafe キーワードを使う必要があります。

「この役割で使う場合、API の利用者に対して注意が必要であることを伝えていま す。」

「API の作成者は、どのような注意が必要かを伝えるべきです。unsafe API は、 安全性要件に関するドキュメントがなければ不完全です。呼び出し側は、必要な要 件を満たしていることを知る必要がありますが、それらが書き留められていなけれ ば、それは不可能です。」

安全性に関する配慮が必要な API を使用する

「unsafe キーワードがもう一方の役割、つまり API の使用を担うのは、中かっこの 近くで使われるときです。

「この役割で使われる場合、unsafe キーワードは、作者が必要な注意を払ったこと を意味します。作者はコードが安全であることを検証しており、他の人に対してそ の保証を与えています。」

「最も一般的なのは unsafe ブロックです。これにより、最初の役割を使って定義 された unsafe 関数を呼び出せます。

「unsafe ブロックでは、raw ポインタをデリファレンスすることのように、コンパ イラが unsafe だと認識している操作を行うこともできます。」

「unsafe キーワードが unsafe トレイトの実装に使われているのを目にすることも あるでしょう。