【问题标题】:Prevent buffer overflows with gets [duplicate]使用gets防止缓冲区溢出[重复]
【发布时间】:2014-01-12 06:13:52
【问题描述】:

gets的声明是:

char * gets ( char * str );

注意 str 的最大尺寸的明显遗漏

cplusplus.com2

请注意,gets 与 fgets 完全不同:不仅 get 使用 stdin 作为源,但它不包括结束换行符 在结果字符串中,并且不允许指定最大大小 for str (可能导致缓冲区溢出).

还有:

最新版本的 C 标准 (2011) 明确 从其规范中删除了此功能。功能是 在 C++ 中已弃用(截至 2011 年标准,遵循 C99+TC3)。

当然,现在通常建议将fgets 替换为gets,因为它的声明如下所示:

char * fgets ( char * str, int num, FILE * stream );

确实采用大小参数。这使它比gets 更安全。

现在,由于我不愿意花钱下载或购买C11 standard,任何人都可以阐明弃用gets 的原因以及它对未来代码的意义吗?为什么 fgets 更安全时它存在于同一个地方?为什么它只是现在被弃用了?

【问题讨论】:

  • N1570 draft 与已发布的 ISO C11 标准几乎相同。
  • @KeithThompson 谢谢你,先生。
  • 我不认为这个问题主要是基于意见的,因为 C 委员会解释了为什么 gets 在标准中。

标签: c language-lawyer fgets buffer-overflow gets


【解决方案1】:

现在,由于我不愿意花钱下载或购买 C11 标准,任何人都可以阐明弃用 get 的原因以及它对未来代码的意义吗? p>

来自 C 委员会的 C99 基本原理:

因为gets不检查缓冲区溢出,所以当它的输入不受程序员控制时使用通常是不安全的。这引起了一些人质疑它是否应该出现在标准中。委员会认为,当程序员确实对输入有足够的控制权时,gets 在那些特殊情况下是有用和方便的,并且作为长期存在的实践,它需要一个标准规范。然而,总的来说, 首选函数是 fgets。

【讨论】:

  • n1570 的最新草稿;谷歌一下,你应该可以找到(合法的)下载。
【解决方案2】:

gets 已被弃用,因为它不安全,正如您已经引用的那样,它可能会导致缓冲区溢出。为了替换,C11 提供了一个替代gets_s,其签名如下:

char *gets_s(char *s, rsize_t n);

请注意,C11 仍然建议用fgets 替换gets

首先是否将gets 放入标准是有争议的,但委员会认为gets 在程序员确实对输入有足够控制权时很有用。

这是委员会的官方解释。

Rationale for International Standard - Programming Languages C §7.19.7.7 gets 函数

因为gets 不检查缓冲区溢出,所以当它的输入不受程序员控制时,使用它通常是不安全的。这引起了一些人质疑它是否应该出现在标准中。委员会认为gets 在程序员确实对输入有足够控制权的特殊情况下是有用和方便的,并且作为长期存在的实践,它需要一个标准规范。但是,一般来说,首选函数是 fgets(请参阅 §7.19.7.2)。

【讨论】:

  • gets_s 并未广泛使用(这是一种轻描淡写的说法)。 AFAIK 唯一可用的地方是 Windows。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 2011-02-17
  • 2013-02-10
相关资源
最近更新 更多