gcc为何以及如何为gets()发出警告? while(1) { printf(“\n输入消息:”); 获取(消息); //发送一些数据 如果(发送(sock,message,strlen(message),0)
这是我计划的一部分。当我编译并运行它时,我得到一个错误。错误消息是 警告:gets函数很危险,不应使用gcc为何以及如何为gets()发出警告? while(1) { printf(“\n输入消息:”); 获取(消息); //发送一些数据 如果(发送(sock,message,strlen(message),0),c,gcc,gets,C,Gcc,Gets,这是我计划的一部分。当我编译并运行它时,我得到一个错误。错误消息是 警告:gets函数很危险,不应使用 您没有向我们展示如何声明变量message,您将该变量作为参数传递给get。如果是的话 while(1) { printf("\nEnter message : "); gets(message); //Send some data if( send(sock , message , strlen(message) ,
您没有向我们展示如何声明变量
message
,您将该变量作为参数传递给get
。如果是的话
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;
}
现在假设程序最终尝试读取的实际输入行长度为200个字符。阵列将溢出,可能导致灾难性的后果。(严重:诚实地说,使用get
导致重大安全漏洞)
无论数组有多大,输入可能总是更大,而且无法防止溢出,因为无法判断
get
数组实际有多大。这就是为什么你不应该使用它。一个简单的谷歌搜索会提供很多有用的信息,比如这个答案
使用获取的缓冲区溢出示例
char message[100];
输出
thegeekstuff
abcdefghijklmnopqr <-- stack smashing
输入2
Correct Password
Root privileges given to the user
关于这个问题:
gets()
函数对于缓冲区溢出的风险是危险的,并且根据C11
标准从标准C
中删除。编译器可能支持它们,以便向后兼容遗留代码
FWIW,此警告并非由gcc本身发出。最有可能的是,glibc
包含导致编译器发出警告的杂注
关于错误:
您已经在编译语句中启用了,它基本上要求gcc
将任何警告视为错误。编译器警告和编译器错误的可能重复-两者都不同。可能是相关的,是的,但是,非常不同。是的,gets
被折旧,现在在c11之后被删除。gets\u s
作为一种更安全的选择被引入。使用像这样的fgets(数组、sizeof(arr)、stdin)
或scanf(%[^\n]*c),arr)
记住切掉\n
如果是fgets
@ARBY,请注意get_s()只是出于向后兼容的原因,标准本身建议使用fgets()。
abcdefghijklmnopqr <-- stack smashing
Wrong Password
Root privileges given to the user