【发布时间】:2010-06-04 12:19:18
【问题描述】:
我在 Unix 中用 C 语言编程,
我正在使用gets 从键盘读取输入。
我总是收到此警告并且程序停止运行:
warning: this program uses gets(), which is unsafe.
谁能告诉我为什么会这样?
【问题讨论】:
-
这是一个不安全的函数;如果程序使用的函数无法检查缓冲区大小,则可能会发出缓冲区溢出攻击
-
如果我使用 scanf() 而不是 gets() 它可以工作,但我必须从键盘读取 2 个输入,并且在我读取第一个后程序停止。为什么?这是代码:字符用户;字符通行证; printf("Iser ID"); scanf("%s",user); printf("密码:"); scanf("%s",pass);
-
@peiska:程序在第一个之后停止,因为它正在等待您进入第二个。你自己把第二个
scanf放在那里。为什么程序“停止”然后让您感到惊讶? -
user和pass需要声明为字符的数组,而不是单个字符。 "%s" 转换说明符期望相应的参数具有char *类型,并且该参数需要指向一个足够长的缓冲区以容纳输入字符串加上 0 终止符(未修饰的 "%s" 转换说明符暴露了在这方面与gets()相同的安全漏洞,但这里没有足够的空间详细介绍)。将user和pass的声明更改为char user[N]; char pass[M]其中 N 和 M 是两个数组所需的大小。
标签: c