c - 为什么gets函数如此危险以至于不应该使用它?

标签 c fgets buffer-overflow gets

当我试图编译在GCC中使用gets()函数的C代码时,会收到以下警告:
(.text+0x34):警告:“gets”函数很危险,不应使用。
我记得这与堆栈保护和安全性有关,但我不确定具体原因。
如何删除此警告?为什么会有使用gets()的警告?
如果gets()如此危险,为什么我们不能移除它?

最佳答案

为了安全地使用gets,您必须确切地知道将要读取的字符数,以便使缓冲区足够大。只有当你确切地知道你将要阅读的数据时,你才会知道。
您不想使用gets,而是希望使用具有签名的fgets

char* fgets(char *string, int length, FILE * stream);

fgets,如果它读取整行,则将在字符串中保留'\n';您必须处理它。)
直到1999年的ISO C标准,它仍然是官方语言的一部分,但是
按照2011年的标准正式删除。大多数C实现仍然支持它,但至少gcc会对使用它的任何代码发出警告。

关于c - 为什么gets函数如此危险以至于不应该使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45714595/

相关文章:

c - 双 "for"循环中的 fgets 和 strtok

c - 缓冲区溢出 - 用金丝雀防御未成功

c - 缓冲区溢出漏洞 - 为什么 shellcode 放在返回地址之前

c - 模拟缓冲区溢出时返回地址错误

c - 使用结构取消引用运算符在 C 中粘贴标记

python - 使用 gcc/ubuntu 的 if 子句中的段错误

c - fgets() 不等待输入

c - 如何针对 linux 换行符\r\n 字符处理任何文本文件中的换行符 '\n'?

c - 如何使用指针将值读入结构?

c float 到 int 的转换行为很奇怪