生ポインタの参照外し

ポインタの作成は安全ですが、参照外しには unsafe が必要です。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Speaker Notes

This slide should take about 10 minutes.

unsafeブロックごとにコメントを記述し、そのブロック内のコードが行うアンセーフな操作がどのように安全性要件を満たしているのかを記述することをおすすめします(Android Rust スタイルガイドでも必須とされています)。

ポインタ参照外しの場合、これはポインタが valid でなければならないことを意味します。つまり、次のようになります。

  • ポインタは null 以外でなければならないこと。
  • ポインタは、(割り当てられた単一のオブジェクトの境界内で)参照外し可能でなければならない。
  • オブジェクトが解放されていないこと。
  • 同じロケーションに同時アクセスすることがないこと。
  • 参照をキャストしてポインタを取得した場合、基になるオブジェクトが存続しなければならず、他のいかなる参照を通してもそのメモリにアクセスがないこと

ほとんどの場合、ポインタも適切にアラインされる必要があります。

“NOT SAFE“というコメントがあるところは、よくあるUBバグの例を示しています。*r1 のライフタイムは 'static であるため、r3 の型は &'static String となり、s より長く存続します。ポインタからの参照の作成には細心の注意が必要です。