私は D プログラミング言語を学んでおり、できる限り SafeD サブセットに制限しようとしています。しかし、writeln のような I/O 関数はすべて @system であることに気付きました。SafeD で I/O を行うにはどうすればよいですか?
Fedora 19 x86-64 (Fedora パッケージからダウンロード) で LDC2 を使用しています。
私は D プログラミング言語を学んでおり、できる限り SafeD サブセットに制限しようとしています。しかし、writeln のような I/O 関数はすべて @system であることに気付きました。SafeD で I/O を行うにはどうすればよいですか?
Fedora 19 x86-64 (Fedora パッケージからダウンロード) で LDC2 を使用しています。
あなたはしません、または少なくとも直接はしません。I/O にはシステム コールを作成する必要があります。つまり、C 関数であり、C 関数は@safe
. そして、writeln
現在はprintf
ボンネットの下で呼び出しているため、安全でないことを行うのは簡単なので(文字列の代わりに整数を渡して渡すなど) 、それは間違いなくではありません。場合によっては作ることもできるかもしれませんが、全体がどうなるかはわかりません。それは、それがどのように実装されているかによって異なります。@safe
printf
%s
writeln
@trusted
重要な D プログラムが@system
コードを使用することは十分に予想されます。コツは隔離することです。あなたのプログラムの大部分はうまくいけ@safe
ば@system
. ただし、メモリの安全性については、プログラムの小さなセクションを調べるだけで済みます。関数を呼び出す@system
関数が実際にメモリセーフであることを手動で確認したら、それをマークしてコード@trusted
で使用でき@safe
ます。
残念ながら、druntime と Phobos の特定のコア要素は@system
、低レベルの要素で行っていることに基づいている可能性が非常に高く、必ずしもそのすべてが本来あるべきようにマークされているとは限りませ@trusted
ん (たとえば、おそらくすることができます-現在それが何であるかはわかりませんが、おそらく配列の要素の型に依存します)。そのため、サポートを改善するために、いくつかの標準ライブラリにいくつかの改善を加える必要がある可能性があります(これは進行中ですが、現在そのすべてがどこにあるのかはわかりません)。将来よりも多くの場所で使用してください。できるかもしれないし、できないかもしれないstd.array.appender
@system
@trusted
@safe
@trusted
writeln
@safe
@trusted
将来。しかし、それで使用している型に機能がない場合は絶対にそうではない@safe
ため、それがどのように実装されているかに関係なく、それを使用しているものに依存する@trusted
toString
かどうかの一部です。ただし、現在は組み込み型でさえないため、現時点では運が悪いです。writeln
@safe
@safe
@trusted
本当にしたい場合は、 のラッパーを作成できますがwriteln
、@trusted
コードが実際にメモリセーフであることを確認するために十分に注意する必要があります。テンプレート化されたラッパーを作成してマークするだけで@trusted
は、うまくいきませんそれは、@safe
渡したタイプに関係なく、それを扱うことになるからです。したがって、それをラップせずに、その特定の使用がメモリセーフ@trusted
であることが確実であるかのように呼び出し元をマークするのがおそらく最善です。writeln
もちろん、それはまた、writeln
現在@system
のような関数が最初にある理由の一部を浮き彫りにしています。@trusted
信頼されるべきではないものを信頼せずにテンプレート化されたコード (テンプレート引数に依存するため)。多くの場合、属性の推論によって問題が解決されますが、テンプレート化されたコードが必要な処理を行っている場合、コードの一部を としてマークし、残りを推論に任せること@trusted
が困難になります。. ただし、最終的にはすべての標準ライブラリについて整理する予定です。@trusted
@system
writeln とその仲間を作成する必要があると思います。@trusted
これらは低レベルのプリミティブを使用しますが、たとえば printf がめちゃくちゃな引数を受け取っていないことを確認するために十分なチェックを行います。