2011-03-22 55 views
0

可能重复:
Why is the `gets' function is dangerous? Why should not be used?错误使用获取,因为它是危险的?

刚刚开始socket编程教程。但是在使用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); 
+0

请参阅[为什么'gets'函数是危险的?为什么不应该使用?](http://stackoverflow.com/questions/1694036/why-is-the-gets-function-is-dangerous-why-should-not-be-used) – 2011-03-22 01:38:28

+0

参见http:/ /stackoverflow.com/questions/4023895/how-to-read-string-entered-by-user-in-c/4023921#4023921 – paxdiablo 2011-03-22 01:58:58

回答

4

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

对于(略)更多的得到,看the Linux gets/fgets manpage的危险。

+1

POSIX的['getline'](http://pubs.opengroup.org/onlinepubs/ 9699919799/functions/getline.html)也是一个不错的选择 – 2011-03-22 01:39:14

+0

@paxdiablo:你为什么把“'Gets'”改为“It”?这似乎是最好的一个小语法点。 – 2011-03-22 02:08:47

+0

这仅仅是不协调的 - 在语言很重要的语言中,我很难大写函数名称,因为新手可能会看到授予'Gets(buff);'例如显然是错误。我通常会写一些东西,例如“函数'获取'”或者(在这种情况下,只有一个主题,“它”。如果您不同意,请将其更改回来,毕竟这是您的答案:-)我只是认为它更好这条路。 – paxdiablo 2011-03-22 02:13:33

0

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

你的教程代码大概是在这个指导成为常规做法之前编写的。