gcc为何以及如何为gets()发出警告? while(1) { printf(“\n输入消息:”); 获取(消息); //发送一些数据 如果(发送(sock,message,strlen(message),0)

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) ,

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

警告:gets函数很危险,不应使用


您没有向我们展示如何声明变量
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