C有真正安全的格式化库吗?

Jam*_*ieH 2 c formatting string-formatting

考虑到关于C 的更安全的格式化库的问题的答案,我想知道是否有一个安全的 C格式化库?

我的意思是:

  • 格式字符串不可能与参数不匹配
  • 传递错误的类型不可能崩溃
  • 没有平台依赖的方面

请不要回答有关Microsoft安全字符串库或不太安全但仍然不完全安全的库,因为我知道这些,并且它们不满足总安全性的要求.

提前致谢

vir*_*tor 6

你是用C写的.C不是类型安全的.如果传递int*而不是a,则无法避免未定义的行为char*.如果你的变量没有为运行时检查进行静态类型检查/标记,那就没有"没有可能"的事情.

如果你有产生警告的东西,那已经很好......

如果您确实需要或想要安全,您可能需要查看旋风(C方言)或一些完全不同的语言.


Log*_*ldo 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);
Run Code Online (Sandbox Code Playgroud)

如果有点冗长,这样的东西将是非常安全的.

  • 好的指针不是(必然)与传递错误类型相同的东西.像我所描述的那样的接口将阻止"oops,将int放在我打算放置char*的地方",printf系列没有.我认为他的意思是"没有可能通过传递错误的类型而崩溃".当然,你总是可以通过演员表来彰显这些东西,你有什么,但是答案变得毫无用处("使用不同的语言.").我选择将其解释为"在不改变编程语言的情况下,最安全的是什么." (2认同)