关于gcc:c:gets()和fputs()是危险函数吗?

c : gets() and fputs() are dangerous functions?

在学校的计算机实验室中,我们使用fputs编写了一个程序,编译器返回了错误gets is a dangerous function to use和与fputs类似的错误
但是在家里,当我键入以下代码时:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
main()
{
    FILE *fp;
    char name[20];
    fp = fopen("name.txt","w");
    gets(name);

    fputs(name,fp);
    fclose(fp);
}

我从来没有收到过任何错误。在学校的那个和这个类似,只是有点长,而且有更多的变数。
我在家中使用代码块,并在学校使用fedora随附的默认gcc。
编译器可能有问题吗?


使用gets,您需要完全知道将要读取多少个字符,并因此使用足够大的缓冲区。如果使用的缓冲区小于读取的文件的内容,则最终将超出所分配缓冲区的写入范围,这将导致未定义行为和无效程序。

您应该使用fgets,它可以指定要读取的数据量。

您不会收到任何错误,因为您分配的缓冲区name很可能足以容纳文件name.txt的内容,但是如果不是,那么这是一个问题,因此编译器会发出警告。铅>


这将是不同编译器的不同设置。也许Codeblocks使用的编译器不是那么冗长,或者没有关闭警告。

无论使用哪种编译器,它们都是危险函数,因为它们不检查缓冲区溢出。请改用fgets或fputs。


gets当然很危险,因为无法防止缓冲区溢出。

例如,如果您的用户输入了150个字符,则几乎可以肯定会导致您的程序出现问题。对于您无法控制的输入,也应避免将scanf与无限制的"%s"格式说明符一起使用。

但是,由于gets符合标准,因此应该不会出错。最多应该是一个警告(除非您(作为开发人员)配置"将警告视为错误"之类的东西。)。

fputs很好,完全没有危险。

有关使用fgets的强大用户输入功能,请参见此处,该功能可用于防止缓冲区溢出。


其他答案均已解决gets,这确实是非常危险的。

但是问题还提到了fputsfputs函数非常安全;它没有这些安全问题。

我相信OP可能会误以为编译器已经警告过`fputs。


对于问题,任何编译器都没有问题。如果查看蒂莫西·琼斯(Timothy Jones)提供的链接,您将理解为什么发出此警告。对于不同版本的编译器,编译器的配置不同,以发出不同级别的警告。