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

7xllpg7q  于 2022-11-13  发布在  其他
关注(0)|答案(5)|浏览(191)

在学校的计算机实验室里,我们用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。
会不会是编译器的问题?

hwazgwia

hwazgwia1#

使用gets时,您需要确切知道要读取多少字符,并相应地使用足够大的缓冲区。如果您使用的缓冲区小于您读取的文件内容,您最终会写入超出分配的缓冲区范围的内容,这将导致未定义的行为和无效程序。
相反,您应该使用fgets,它允许您指定要读取的数据量。
您不会得到任何错误,因为很可能您分配的缓冲区name足够大,可以容纳文件name.txt的内容,但如果它不是,那么它是一个问题,因此编译器发出警告。

mfpqipee

mfpqipee2#

gets肯定是危险的,因为没有办法防止缓冲区溢出。
例如,如果用户输入了150个字符,这几乎肯定会导致程序出现问题。对于您无法控制的输入,也应该避免使用scanf和未绑定的"%s"说明符。
但是,使用gets * 不 * 应该是错误,因为它符合标准。* 最多,* 它应该是一个警告(除非您作为开发人员,配置了“将警告视为错误”之类的内容)。
fputs很好,一点也不危险。
请参阅此处,了解使用fgets的强大用户输入函数,该函数可用于防止缓冲区溢出。

wqsoz72f

wqsoz72f3#

这可能只是不同编译器的不同设置,也许代码块使用的编译器没有那么详细,或者关闭了警告。
无论使用哪种编译器,它们都是危险的函数,因为它们没有缓冲区溢出检查。请改用fgets或fputs。

axkjgtzd

axkjgtzd4#

其他的答案都是针对gets,这真的很危险。
但是这个问题也提到了fputsfputs函数是完全安全的;它没有这些类型的安全顾虑。
我相信OP可能是错误的,它暗示编译器已经警告了fputs

m4pnthwp

m4pnthwp5#

至于问题,任何一个编译器都没有问题。如果你看一下Timothy Jones提供的链接,你就会明白为什么会发出这个警告。对于不同版本的编译器,编译器的配置不同,发出的警告级别也不同。

相关问题