【问题标题】:Error using gets because it is dangerous? [duplicate]使用gets时出错,因为它很危险? [复制]
【发布时间】:2011-07-20 03:18:16
【问题描述】:

可能重复:
Why is the `gets' function is dangerous? Why should not be used?

刚开始学习套接字编程。但是在用 gcc 编译后我得到了这个错误。如何克服这种危险?

In function `main':
tcpserver.c:(.text+0x1f3): warning: the `gets' function is dangerous and should not be used.

这行代码取自互联网(http://www.prasannatech.net/2008/07/socket-programming-tutorial.html):

printf("\n  Your message (hit q or Q to quit): ");
              gets(send_data);

【问题讨论】:

标签: c


【解决方案1】:

gets() 盲目地将数据写入你给它的缓冲区。它既不知道也不关心缓冲区的长度,使其成为等待发生的buffer overflow。如果可以,请改用fgets()

有关获取危险的(略)更多信息,请参阅the Linux gets/fgets manpage

【讨论】:

  • POSIX 的getline 也是一个不错的选择
  • @paxdiablo:你为什么把“Gets”改成“It”?这似乎充其量只是一个次要的语法点。
  • 这只是不协调 - 在大小写很重要的语言中,我很难将函数名称大写,因为新手可能会将其视为授权 Gets (buff);,例如,显然是一个错误。我通常写诸如“函数gets”或(在这种情况下只有一个主题,“它”。如果你不同意,把它改回来,毕竟这是你的答案:-)我只是觉得它更好这边。
  • 你说得很好,我只是想知道——不能生气到把它改回来,而且太懒了:P。我在我学习 Unix 的书中选择了我的风格,其中句子以“Tar 格式是迄今为止最流行的软件分发格式......”现在我想起来了,我从来没有见过风格别处...
【解决方案2】:

这是a dupe 之前在 stackoverflow 上提出的一个问题。基本上,gets() 可能容易受到缓冲区溢出的影响,因此编译器建议您用另一种方法替换它,在该方法中明确指定要读取的最大缓冲区长度。这种警告在编译器中越来越常见,以鼓励人们编写更安全的代码(缓冲区溢出是安全漏洞的常见来源)。

您的教程代码大概是在本指南成为普遍做法之前编写的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-19
    • 2011-03-16
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多