2009-05-09 9 views
2

は、Cのためのライブラリをフォーマットsaferについての質問に与えられた答えが、私は図書館をフォーマット安全 Cがあるかどうかを思ったんだけど?念頭に置きますかC用の本当に安全な書式設定ライブラリはありますか?

私は何を意味することは次のとおりです。

  • 引数からフォーマット文字列
  • なしプラットフォーム依存の側面があるじゃないんだ、間違ったタイプ
  • を渡すことによってクラッシュするいかなる可能性はありませんが不一致のために何の可能性はありません

危険な少ないですが、それでもN Microsoft Safe String Library、またはライブラリについてはお答えしないでください私はこれらのことを認識しているので、完全に安全です、そして、彼らは完全な安全のための要件を満たしていません。あなたはC. Cで書いている事前

答えて

6

おかげでタイプセーフではありません。 char*の代わりにint*を渡すと、未定義の動作を回避することはできません。あなたの変数が静的にタイプチェックされていないか、ランタイムチェックのためにタグ付けされていない場合、 "可能性はありません"というようなことはありません。

あなたは警告を生成し、何かを持っている場合、それはすでにかなり良いことだ...

あなたは本当にを必要とするか、または安全性をしたい、あなたはcyclone(Cの方言)を見てしたいことがあり、あるいはいくつかの完全場合異なる言語。

+1

+1はCycloneのx-refです。面白い。 –

+0

+1:私はサイクロンが大好き! –

5

あなたはフォーマット文字列をしたい場合は、基本的にそれを行うことができない特別なコンパイラのサポートなしで、引数

から書式文字列を不整合に何の可能性はありません。つまり、書式文字列を忘れた場合、Cで安全な書式設定ライブラリを使用することができます。私は気づいていないが、もし存在すれば驚くことはないだろう。

typedef ... FORMATTER; 

FORMATTER create_formatter(); 
int fmt_add_string_default(FORMATTER f, const char *s); 
int fmt_add_string(FORMATTER f, const char *s, int maxlength, const char fill, enum fmt_alignment align); 
... 
int fmt_add_decimal_default(FORMATTER f, int d); 
... // you get the idea 
int fmt_write_result(FORMATTER f, char *out, int out_length); 
void destroy_formatter(FORMATTER f); 

ビット冗長な場合には、このような何かが、完全に安全次のようになります。

一つは、のようなインタフェースを持つことができます。

+0

それはまだ彼の不可能な要件を満たしていない、tho。たとえば、fmt_add_string_defaultの文字列が悪いポインタの場合、アプリはほぼ確実にクラッシュします。 –

+2

よくないポインタは、間違った型を渡すのと同じ(必ず)同じものではありません。私が記述したようなインタフェースは、printfファミリがしない "char *を置くことを意図したintを置く"を防ぎます。私はそれが "間違ったタイプを渡すことによってクラッシュする可能性はない"と彼が意図したことだと思います。もちろん、これらのことは常にキャストを通してサブノードすることができますが、あなたは何をしていますが、答えは役に立たなくなります(「別の言語を使用する」)。私はそれを「プログラミング言語を変えずに得ることができる最も安全なもの」と解釈しました。 –

+1

ええ、私はそれを理解していますが、答えは別の言語を使うことです。彼の要求はCの使用を排除します。 –

1

いいえ、あなたが紹介する「安全性」が何であれ、それは言語によって守られることができるからです。それはあなたの城を砂の上に建てるようなものです - 城がどれほど良いかどうかは関係ありません。砂を掘り下げてもそれは落ちるようにできます。

特定のパラメータタイプを強制するメカニズムはありません。

私の意見では、人々が自分のツールを使用していない場合、それは自分の問題です。あなたは3歳の子供にソフトウェアを提供するはずがありません。彼らは少しの知性を持つことが予想されます。

関連する問題