C 用の本当に安全な書式設定ライブラリはありますか?
-
20-08-2019 - |
質問
ある質問に対する答えを念頭に置いて、 より安全な C 用の書式設定ライブラリがあるかどうか疑問に思っています。 安全 Cフォーマットライブラリ?
私が言いたいのは:
- 引数のフォーマット文字列が一致しない可能性はありません
- 間違った型を渡してもクラッシュする可能性はありません
- プラットフォームに依存する要素はありません
については答えないでください Microsoft セーフ文字列ライブラリ, 、またはそれ以下のライブラリ 危険な しかし、私が知っている限り、完全に安全というわけではなく、完全な安全の要件を満たしていません。
前もって感謝します
解決
あなたはC. Cで書いているタイプセーフではありません。あなたはint*
の代わりにchar*
を渡す場合は、未定義の動作を避けることができません。あなたの変数は静的型チェックされていない場合は/ランタイムチェックのためにタグ付けされた「何の可能性はありません」などというものはありません。
あなたは警告を生成し、何かを持っている場合、それはすでにかなり良いことだ...
あなたが本当に必要 のか、安全性が必要な場合は、は、サイクロンを見てすることができますの(C方言)、またはいくつかの完全に異なる言語
他のヒント
あなたはフォーマット文字列を使用する場合は、の引数からフォーマット文字列を不整合に何の可能性はありません。
は、特別なコンパイラのサポートなしで、あなたは基本的にそれを行うことはできません。つまり、フォーマット文字列を見送る場合は、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);
少し冗長な場合は、このような何かは、完全に安全になります。
いいえ、あなたが紹介するものは何でも「安全」は言語によってsubornedすることができるからです。それは砂の上にお城を構築するようなものだ - あなたがそれの下から砂を掘る場合は、城が、まだ収めることができているどのように良い関係ありません。
。特定のパラメータの型を強制するCでの機構がない、またあるはずです。
それらが意図しているとして、人々はあなたのツールを使用しない場合、それは私の意見では、自分自身の問題です。あなたは、3歳児にソフトウェアを提供することになっていない - 彼らは知性の一部ささやかが期待している。
。