2

牢记关于更安全的 C 格式库的问题的答案,我想知道是否有安全的C 格式库?

我的意思是:

  • 不可能与参数中的格式字符串不匹配
  • 传递错误的类型不会导致崩溃
  • 没有平台相关的方面

请不要回答有关Microsoft Safe String Library或不太安全但仍不完全安全的库,因为我知道这些,它们不满足完全安全的要求。

提前致谢

4

3 回答 3

6

您正在用 C 编写。C 不是类型安全的。如果传递 aint*而不是 a ,则无法避免未定义的行为char*。如果您的变量没有经过静态类型检查/标记以进行运行时检查,则没有“不可能”之类的事情。

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

如果你真的需要或想要安全,你可能想看看旋风(C 方言),或一些完全不同的语言。

于 2009-05-09T23:50:28.597 回答
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);

如果有点冗长,这样的事情将是完全安全的。

于 2009-05-09T23:56:19.100 回答
1

不,因为您介绍的任何“安全性”都可以被语言所取代。这就像在沙子上建造你的城堡——不管城堡有多好,如果你从它下面挖出沙子,它仍然可以倒塌。

C 中没有强制执行特定参数类型的机制,也不应该有。

If people don't use your tools as they're meant to, that's their own problem, in my opinion. You're not supposed to be providing software to three-year-olds - they're expected to have some modicum of intelligence.

于 2009-05-10T00:38:22.647 回答