8

私は D プログラミング言語を学んでおり、できる限り SafeD サブセットに制限しようとしています。しかし、writeln のような I/O 関数はすべて @system であることに気付きました。SafeD で I/O を行うにはどうすればよいですか?

Fedora 19 x86-64 (Fedora パッケージからダウンロード) で LDC2 を使用しています。

4

2 に答える 2

10

あなたはしません、または少なくとも直接はしません。I/O にはシステム コールを作成する必要があります。つまり、C 関数であり、C 関数は@safe. そして、writeln現在はprintfボンネットの下で呼び出しているため、安全でないことを行うのは簡単なので(文字列の代わりに整数を渡して渡すなど) 、それは間違いなくではありません。場合によっては作ることもできるかもしれませんが、全体がどうなるかはわかりません。それは、それがどのように実装されているかによって異なります。@safeprintf%swriteln @trusted

重要な D プログラムが@systemコードを使用することは十分に予想されます。コツは隔離することです。あなたのプログラムの大部分はうまくいけ@safe@system. ただし、メモリの安全性については、プログラムの小さなセクションを調べるだけで済みます。関数を呼び出す@system関数が実際にメモリセーフであることを手動で確認したら、それをマークしてコード@trustedで使用でき@safeます。

残念ながら、druntime と Phobos の特定のコア要素は@system、低レベルの要素で行っていることに基づいている可能性が非常に高く、必ずしもそのすべてが本来あるべきようにマークされているとは限りませ@trustedん (たとえば、おそらくすることができます-現在それが何であるかはわかりませんが、おそらく配列の要素の型に依存します)。そのため、サポートを改善するために、いくつかの標準ライブラリにいくつかの改善を加える必要がある可能性があります(これは進行中ですが、現在そのすべてがどこにあるのかはわかりません)。将来よりも多くの場所で使用してください。できるかもしれないし、できないかもしれないstd.array.appender@system@trusted@safe@trustedwriteln@safe@trusted将来。しかし、それで使用している型に機能がない場合は絶対にそうではない@safeため、それがどのように実装されているかに関係なく、それを使用しているものに依存する@trusted toStringかどうかの一部です。ただし、現在は組み込み型でさえないため、現時点では運が悪いです。writeln@safe@safe@trusted

本当にしたい場合は、 のラッパーを作成できますがwriteln@trustedコードが実際にメモリセーフであることを確認するために十分に注意する必要があります。テンプレート化されたラッパーを作成してマークするだけで@trustedは、うまくいきませんそれは、@safe渡したタイプに関係なく、それを扱うことになるからです。したがって、それをラップせずに、その特定の使用がメモリセーフ@trustedであることが確実であるかのように呼び出し元をマークするのがおそらく最善です。writelnもちろん、それはまた、writeln現在@systemのような関数が最初にある理由の一部を浮き彫りにしています。@trusted信頼されるべきではないものを信頼せずにテンプレート化されたコード (テンプレート引数に依存するため)。多くの場合、属性の推論によって問題が解決されますが、テンプレート化されたコードが必要な処理を行っている場合、コードの一部を としてマークし、残りを推論に任せること@trustedが困難になります。. ただし、最終的にはすべての標準ライブラリについて整理する予定です。@trusted@system

于 2013-09-30T19:17:25.183 に答える
5

writeln とその仲間を作成する必要があると思います。@trustedこれらは低レベルのプリミティブを使用しますが、たとえば printf がめちゃくちゃな引数を受け取っていないことを確認するために十分なチェックを行います。

于 2013-09-30T20:12:39.853 に答える