2012-01-19 53 views
1

在学校的计算机实验室里,我们写了使用fputs程序和编译器返回错误gets is a dangerous function to use和类似的错误fputs

但在家里,当我在此位的代码类型:c:gets()和fputs()是危险函数吗?

#include <stdio.h> 
main() 
{ 
    FILE *fp; 
    char name[20]; 
    fp = fopen("name.txt","w"); 
    gets(name); 

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

我没有任何错误是如此。学校里的那个和这个相似,只是有点冗长而且有很多变数。
我在家中使用代码块,并在学校使用fedora提供的默认gcc。
它可能是编译器的问题吗?

+2

http://stackoverflow.com/questions/2843073/warninggets-function-is-dangerous –

+6

可能的重复这就是为什么家比学校好:) – Mahesh

+2

学校的实验室环境可能已被配置,以便GCC编译在警告级别高于您的设置。无论如何,最好听取警告。 –

回答

1

gets由于无法防止缓冲区溢出,所以肯定是危险的。

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

但是,使用gets应该而不是是错误的,因为它符合标准。在大多数,它应该是一个警告(除非你,作为开发者,配置像“把警告视为错误”)。

fputs很好,根本没有危险。

请参阅here以获得强大的用户输入功能,使用fgets,可用于防止缓冲区溢出。

2

With gets您需要准确知道您将读取多少个字符,并相应地使用足够大的缓冲区。如果您使用的缓冲区小于您读取的文件内容,则最终会超出分配的缓冲区范围,导致未定义行为和无效程序。

相反,您应该使用fgets,它允许您指定要读取多少数据。

你不会得到任何错误,因为很可能你分配的缓冲区name足够大以容纳你的文件内容name.txt,但如果它不是那么它的问题,因此编译器发出警告。

1

这只是不同编译器的不同设置。也许Codeblocks使用的编译器不是冗长的或者警告关闭。

不管编译器是否使用危险函数,因为它们没有缓冲区溢出检查。改用fgets或fputs。

0

至于问题,任何编译器都没有任何问题。如果你看看蒂莫西琼斯提供的链接,你会明白为什么会发出这个警告。至于不同版本的编译器,编译器配置不同,发出不同级别的警告。