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。
编译器可能有问题吗?
- 可能重复的stackoverflow.com/questions/2843073/…
-
那就是为什么家比学校更好的原因:)
-
学校的实验室环境可能已经过配置,因此GCC的编译警告级别高于您的设置。无论如何,最好注意警告。
-
当您是新手时,有两个重要的经验法则:信任编译器(很少出错!)并要求其发出所有警告(使用gcc -Wall)。大多数真正的程序员都会改进他们的代码,直到没有给出警告为止。
-
听起来有人在学校的机器上耍神。如果他们尝试进行教育,那会更好。教你如何钓鱼比只给你一条鱼要好。 (更好地教您为什么他们认为这些事情不好,而不是阻止您直接学习)。
-
FYI gets非常危险,已从最新的C标准中删除。永远不要,永远不要使用它。它是1970年代Unix上第一个C语言的过去的遗物。但是puts是可以安全使用的。
-
@BasileStarynkevitch,我实际上比这更进一步,并使用了gcc -Wall -Wextra,因为我发现gcc是关于" all"的定义的病态骗子:-)
-
自己看看,编译后运行echo {0..100} | tr -d ' './a.out
使用gets,您需要完全知道将要读取多少个字符,并因此使用足够大的缓冲区。如果使用的缓冲区小于读取的文件的内容,则最终将超出所分配缓冲区的写入范围,这将导致未定义行为和无效程序。
您应该使用fgets,它可以指定要读取的数据量。
您不会收到任何错误,因为您分配的缓冲区name很可能足以容纳文件name.txt的内容,但是如果不是,那么这是一个问题,因此编译器会发出警告。铅>
这将是不同编译器的不同设置。也许Codeblocks使用的编译器不是那么冗长,或者没有关闭警告。
无论使用哪种编译器,它们都是危险函数,因为它们不检查缓冲区溢出。请改用fgets或fputs。
gets当然很危险,因为无法防止缓冲区溢出。
例如,如果您的用户输入了150个字符,则几乎可以肯定会导致您的程序出现问题。对于您无法控制的输入,也应避免将scanf与无限制的"%s"格式说明符一起使用。
但是,由于gets符合标准,因此应该不会出错。最多应该是一个警告(除非您(作为开发人员)配置"将警告视为错误"之类的东西。)。
fputs很好,完全没有危险。
有关使用fgets的强大用户输入功能,请参见此处,该功能可用于防止缓冲区溢出。
其他答案均已解决gets,这确实是非常危险的。
但是问题还提到了fputs。 fputs函数非常安全;它没有这些安全问题。
我相信OP可能会误以为编译器已经警告过`fputs。
。
对于问题,任何编译器都没有问题。如果查看蒂莫西·琼斯(Timothy Jones)提供的链接,您将理解为什么发出此警告。对于不同版本的编译器,编译器的配置不同,以发出不同级别的警告。