为什么gets()函数被弃用?

3
在我的代码中使用gets()时,编译器会报错。
warning: the 'gets' function is dangerous and should not be used.`

并且

warning: ‘gets’ is deprecated (declared at /usr/include/stdio.h:638)
[-Wdeprecated-declarations]

有具体的原因吗?


请改用fgetsstdin。正如消息所说,gets是危险的,因为它无法防止缓冲区溢出。 - Weather Vane
1
“为什么编译器在这里发出警告?”的字面意思是“因为编译器的程序员让它这样做了。” - user253751
2个回答

6
有人能解释一下编译器为什么会显示这样吗?
是的,因为gets()函数存在缓冲区溢出问题,因此应避免使用。另外,关于-Wdeprecated-declarations的警告,gets()不再是C标准的一部分[从C11开始]。因此,C库编译器不再支持这一点。未来可以删除它。编译器发出警告消息,旨在提醒开发人员潜在陷阱并阻止进一步使用gets()
(##)严谨地说,警告并不是由编译器(gcc)本身生成的,而是由glibcgets()实现上的一个pragma或属性引起的,这导致编译器发出了警告。[感谢dupe答案中的FUZxxl提供的信息。]

2
  1. gets可能会导致缓冲区溢出,因为它不考虑数据的长度。更多详细信息请参见:C语言中的gets()函数

  2. “deprecated”消息意味着该函数已被标记为过时,并可能在以后的时间从标准中删除。因此,不建议用户使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接