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/58429389/

相关文章:

c - C语言中的有限状态机

C 编程 通过<time.h>的time(&start)函数改变程序结果

c - 文件读取错误值

c - fgets 跳过空行

c - 为什么 C 没有像 strcpy() 这样使用的函数并自动检查缓冲区大小以防止缓冲区溢出错误?

c - 如何测量 Visual Studio 中 C 程序的函数堆栈大小?

c - 标准输入缓冲区是否为空 C

c - 停止fgets在C中转义 '\'(这样我就可以输入八进制形式的字符)

c - 跳过c代码中的下一条指令

stack - 什么是堆栈随机化以及它如何防止缓冲区溢出攻击?