【问题标题】:Is gets() officially deprecated? [duplicate]gets() 被正式弃用了吗? [复制]
【发布时间】:2011-11-17 10:20:32
【问题描述】:

基于 C++11 的 most recent draft,C++ 参考 ISO/IEC 9899:1999/Cor.3:2007(E) 对 C 库函数的定义(根据 §1.2[intro.refs] /1)。

基于 C99 TC3 的 most recent draftThe gets function is obsolescent, and is deprecated.(根据 §7.26.9/2)

我可以肯定地说gets() 在 C 和 C++ 中都已被弃用吗?

【问题讨论】:

  • 这有关系吗?无论如何你都不应该使用它。
  • 好吧,手册页上写着:Never use gets(). Because it is impossible to tell without knowing the data in advance how many charac‐ters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() Instead. 所以,我想说不管它的官方状态如何,都不要使用它。
  • gets() 应该只用于教新程序员有关缓冲区溢出的知识。
  • 我不使用它,但在争论中“危险”听起来不像“弃用”那么强烈。很多事情都是危险的。
  • @Cubbi:许多被错误标记为“危险”的东西都有正确和错误用途,称其为“危险”的人是根据某人以不正确的方式使用它的可能性强加自己的判断.另一方面,gets 基本上没有正确的用途;任何使用它都会导致程序出错。

标签: c++ c deprecated gets


【解决方案1】:

距离 C++11 全面实施还需要一段时间。

此外,大多数编译器甚至还不完全支持 C99。

例如,微软没有。

所以不,它在 C 和 C++ 中都没有被弃用。

【讨论】:

  • 它已被所有理智的程序员弃用多年。出于向后兼容性的原因,它存在于系统中已有很长时间了。这并不意味着您必须使用;事实上,你不应该使用它。至于MS不支持C99;在我的书中,这将成为弃用 MS 编译器的理由。
  • @Jonathan:Visual-C++ 是一个很好的 C++ 编译器。它没有义务完全支持 C99(但是,我认为 C++11 确实如此)。
  • 弃用并不一定意味着现代编译器不支持某些东西。这甚至不意味着他们不应该——事实上,向后兼容通常被视为一件好事。它确实的意思是程序员不应该使用新代码中已弃用的内容,并鼓励他们从旧代码中删除它。
【解决方案2】:

这有关系吗?您可以使用gets 的唯一方法是如果已知stdin 附加到您可以完全控制其内容的文件。这个条件几乎不可能满足,尤其是在多进程系统上,其他进程可能会相对于您的程序异步修改文件。因此,出于所有实际目的,任何使用gets 的程序都有未定义的行为(即,可能存在未定义行为的输入/环境条件),特别是如果您的程序有可能导致特权妥协的 UB比数据提供者更高的权限。

编辑:好的,这是gets 的一种安全用法,大概是我能马上想到的唯一一种...

if (feof(stdin)) gets(buf);

当然,即使已经为流设置了 EOF 指示符,一些有缺陷的实现(可能包括 glibc..?)也允许读取,所以....

【讨论】:

  • 有人可能会说输入是他们合同的一部分,但我认为 GIGO 方法也早已过时。
  • @Cubbi:我对 GIGO 和 GIUBO 做了严格的区分。
  • 大声笑,你给出的“一次安全使用”真的有任何目的吗?如果您知道标准输入位于 EOF,您为什么还要尝试从中获取输入?
  • @flarn2006:不,这在很大程度上是针对 read-past-eof 错误的廉价尝试。 :-)
【解决方案3】:

即使是从库中删除gets() 会破坏的代码,在删除之后也会比删除之前更少破坏。我想编译器供应商可能有必要将它包含在“完全符合标准”的模式中,但是可以安全使用它的情况非常少,以至于将它排除在“正常”模式之外可能是合理的" 构建。

【讨论】:

    【解决方案4】:

    不推荐使用意味着您不应该使用它,并且将来可能会被删除。由于两个标准都说它已被弃用,这意味着它已被正式弃用。

    【讨论】:

      【解决方案5】:

      好吧,它已完全从 C11 标准中删除,所以我认为这是肯定的。

      【讨论】:

        猜你喜欢
        • 2011-01-13
        • 2017-08-14
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-21
        相关资源
        最近更新 更多