Microsoftは5月21日(現地時間)、C#のメモリ安全性を抜本的に強化する新しい安全モデルを発表した。
今回のアップデートでは、unsafeキーワードの役割が見直され、従来の「安全でない構文のマーカー」から「コール元に義務を課す契約」として機能するようになる。新モデルは.NET 11でプレビュー公開、.NET 12で本格導入予定だ。
現行仕様ではunsafeは主にポインタ使用部分を囲むために用いられていたが、新モデルでは、コンパイラーがunsafeキーワードの使用を厳格に要求する。unsafeは単なる構文域の指定ではなく、コール元が安全義務を負う契約表現へと転換される。これにより、どこが安全でどこがリスクを持つかがコード上で明確になり、レビュアビリティの向上や監査の効率化が見込まれる。
unsafeで定義された関数は、コール元が明示的にunsafeブロックで呼び出す必要があり、適切なドキュメント(/// <safety>ブロック)で安全性の契約や義務が明示される。これまで暗黙の慣習だった安全確保が明文化され、ドキュメント/解析ツールが欠落を検知できるようになる。
また、unsafeの範囲は型レベルではなく個々のメンバー、プロパティ、フィールドに限定。ポインタ型がシグネチャに含まれるだけでは自動的にunsafeにはせず、実際に危険な操作(例えばデリファレンス)が発生する箇所ごとに明示される形となる。新たなsafeキーワードも導入され、extern宣言などで必要に応じて安全性を明示する。
この新しい安全モデルはプロジェクト単位でオプトイン可能で、移行を助けるツールも用意される予定。既存の大半のプロジェクトでは、unsafe APIを利用していなければ大きな影響はないが、ライブラリ側では新モデルへの対応が進行中だ。
- 関連リンク
この記事は参考になりましたか?
- この記事の著者
-
CodeZine編集部(コードジンヘンシュウブ)
CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
