为什么以及gcc如何为gets()发出警告?

while(1) { printf("\nEnter message : "); gets(message); //Send some data if( send(sock , message , strlen(message) , 0) < 0) { puts("Send failed"); return 1; } //Receive a reply from the server if( recv(sock , server_reply , 2000 , 0) < 0) { puts("recv failed"); break; } puts("Server reply :"); puts(server_reply); } close(sock); return 0; } 

这是我的计划的一部分。 当我编译并运行它时,我收到一个错误。 错误的消息是

警告:获取function很危险,不应该使用!

一个简单的谷歌搜索会给出很多有用的信息,比如这个答案。

https://stackoverflow.com/a/1694042/2425366

使用gets缓冲区溢出示例

 #include  #include  int main(void) { char buff[15]; int pass = 0; printf("\n Enter the password : \n"); gets(buff); if (strcmp(buff, "thegeekstuff")) { printf("\n Wrong Password \n"); } else { printf("\n Correct Password \n"); pass = 1; } if (pass) { /* Now Give root or admin rights to user*/ printf("\n Root privileges given to the user \n"); } return 0; } 

输入1

 thegeekstuff 

产量

  Correct Password Root privileges given to the user 

输入2

 abcdefghijklmnopqr <-- stack smashing 

产量

  Wrong Password Root privileges given to the user 

关于这个问题:

根据C11标准, gets()函数对于缓冲区溢出的风险是危险的,并且从标准C删除。 编译器可以支持它们以便对遗留代码进行向后兼容。

FWIW,这个警告不是由gcc本身发出的。 最有可能的是, glibc包含一个pragma,导致编译器发出警告。 参考

关于错误:

您在编译语句中启用了-Werror ,这基本上要求gcc将任何警告视为错误。

您没有告诉我们您如何声明您传递的变量message作为gets的参数。 假设它是

 char message[100]; 

现在假设程序最终尝试读取的实际输入行长度为200个字符。 arrays将溢出,可能带来灾难性的后果。 (说真的:诚实到善良的主要安全漏洞都源于使用gets 。)

无论你的数组有多大,输入可能总是更大,并且没有办法防止溢出,因为无法判断数组实际gets多大。 这就是你永远不应该使用它的原因。