メモリーセーフDスペック

プログラムの "メモリ安全性"とは、以下のように定義される。 と定義される。 従って、Dの安全なサブセットは、絶対にメモリを破壊しないことが保証されたプログラミング言語機能のみから構成される。 D言語の安全なサブセットは、メモリ破壊を起こさないことが保証されたプログラミング言語機能のみで構成される。 で構成される。その根拠についてはこの記事を参照のこと。 根拠を参照されたい。
メモリー・セーフ・コードは、以下のような特定の言語機能を使うことができない。 など、特定の言語機能を使用することはできない:
- 型システムを破壊するキャスト。
- ポインタ値の変更。
- ローカル変数や関数パラメーターのアドレスを取る。
使用方法
メモリ安全性の観点から、関数には3つのカテゴリーがある:
@system 関数は、その言語の観点から合法なあらゆる操作を実行することができる、 ポインタのキャストやポインタの算術演算のような、本質的にメモリを安全でない操作 も含まれる。 しかし、静的配列のインデックス付けや、期限切れスタック・フレームへのポインタのリターンなど、コンパイル時に既知のメモリ破壊操作を行うことは可能である。 へのポインタを返したりするような、コンパイル時に既知のメモリ破壊を引き起こす操作は、やはりエラーになる可能性がある。 関数は、 関数から直接呼び出すことはできない。@system @safe
@trusted 関数は 関数のすべての機能を持つが、関数から呼び出すことができる。 関数から呼び出すことができる。このため、関数の使用範囲は非常に限定されるべきである。典型的な 関数 "の典型的な使い方としては、バッファ・ポインタと長さの引数を別々に取るシステム・コールを、配列で呼び出せるようにラップすることなどがある。 関数は@system @safe @trusted @safe @trusted 安全なインターフェースを持たなければならない。
@safe 関数は安全なインタフェースを持たなければならない。関数が行うことのできる操作にはいくつかの制限があり、メモリ破壊を引き起こす可能性のある操作を禁止するためのものである。 関数ができることにはいくつかの制限があり、メモリ破壊を引き起こす可能性のある操作を禁止するためのものである。@safe 関数を参照のこと。
これらの属性は、テンプレート化された関数など、コンパイラが関数本体を利用できる場合に推測される。
配列境界チェックはメモリ安全性を強制するために必要である。 これらのチェックは、-release モードであっても、@safe コードに対して(デフォルトで)有効になっている。
スコープとリターン・パラメーター
関数パラメータ属性return とscope は、関数に渡された低レベルポインタの動作を追跡するために使用される。 を追跡するために使用される。このようなポインタには、生のポインタ、配列、this 、クラス、ref パラメータ、デリゲート/レイジー・パラメータが含まれる、 およびポインタを含む集合体である。
scope 関数に渡されるグローバル変数やポインタ(および関数内で呼び出される他の関数に再帰的に渡されるポインタ)において、指されたオブジェクトへの参照が保持されないようにする。 関数を呼び出した結果、グローバル変数または関数に渡されたポインタ(および関数内で呼び出された他の関数に再帰的に渡されたポインタ)に、指されたオブジェクトへの参照が保持されないことを保証する。 、関数本体とパラメータ・リスト内の変数は、結果としてその割り当てが省略される可能性がある。scope
return は、関数の戻り値または最初のパラメータが、そのパラメータから派生したポインタであることを示す。 パラメータから派生したポインタであることを示す。 コンストラクタの場合、 は(暗黙的に返される) 参照に適用される。 void 関数では、 が であるreturn return return this return ref場合、最初のパラメータに適用される、 これは、UFCS、プロパティ・セッター、非メンバー関数(例えば、 のように使用される )をサポートするためである。put(dest, source) put
これらの属性は正式なパラメータリストの後に現れるかもしれず、その場合はメソッドのthis パラメータに適用される。 自由関数の最初のパラメタがref の場合、そのパラメタに適用される。 return または、scope は、低レベルポインタでない型に適用されると無視される。
注釈: scope パラメータのチェックは現在、 コマンドライン・フラグでコンパイルされた コードに対してのみ有効である。 -dip1000 コマンド・ライン・フラグでコンパイルされた@safe コードに対してのみ有効である。
制限事項
メモリ安全性は、コードが移植可能であること、健全なプログラミング手法のみを使用していることを意味しない。 健全なプログラミング手法のみを使用し、バイトオーダーの依存性がない、 その他のバグがないことを意味するものではない。それは、メモリ破壊の可能性を排除することだけに焦点を当てている。 可能性がある。
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku