在学校的计算机实验室里,我们用fputs
编写了一个程序,编译器返回了一个错误gets is a dangerous function to use
和一个类似的错误fputs
但是在家里当我输入这段代码时
#include <stdio.h>
main()
{
FILE *fp;
char name[20];
fp = fopen("name.txt","w");
gets(name);
fputs(name,fp);
fclose(fp);
}
我从来没有出错过。学校里的那个和这个很相似,只是有点长,变量更多。
我在家里使用代码块,在学校使用fedora提供的默认gcc。
会不会是编译器的问题?
5条答案
按热度按时间hwazgwia1#
使用
gets
时,您需要确切知道要读取多少字符,并相应地使用足够大的缓冲区。如果您使用的缓冲区小于您读取的文件内容,您最终会写入超出分配的缓冲区范围的内容,这将导致未定义的行为和无效程序。相反,您应该使用
fgets
,它允许您指定要读取的数据量。您不会得到任何错误,因为很可能您分配的缓冲区
name
足够大,可以容纳文件name.txt
的内容,但如果它不是,那么它是一个问题,因此编译器发出警告。mfpqipee2#
gets
肯定是危险的,因为没有办法防止缓冲区溢出。例如,如果用户输入了150个字符,这几乎肯定会导致程序出现问题。对于您无法控制的输入,也应该避免使用
scanf
和未绑定的"%s"
说明符。但是,使用
gets
* 不 * 应该是错误,因为它符合标准。* 最多,* 它应该是一个警告(除非您作为开发人员,配置了“将警告视为错误”之类的内容)。fputs
很好,一点也不危险。请参阅此处,了解使用
fgets
的强大用户输入函数,该函数可用于防止缓冲区溢出。wqsoz72f3#
这可能只是不同编译器的不同设置,也许代码块使用的编译器没有那么详细,或者关闭了警告。
无论使用哪种编译器,它们都是危险的函数,因为它们没有缓冲区溢出检查。请改用fgets或fputs。
axkjgtzd4#
其他的答案都是针对
gets
,这真的很危险。但是这个问题也提到了
fputs
。fputs
函数是完全安全的;它没有这些类型的安全顾虑。我相信OP可能是错误的,它暗示编译器已经警告了
fputs
。m4pnthwp5#
至于问题,任何一个编译器都没有问题。如果你看一下Timothy Jones提供的链接,你就会明白为什么会发出这个警告。对于不同版本的编译器,编译器的配置不同,发出的警告级别也不同。