为什么以及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
多大。 这就是你永远不应该使用它的原因。