首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >会发生什么?gets()

会发生什么?gets()
EN

Stack Overflow用户
提问于 2009-05-13 20:37:06
回答 6查看 231关注 0票数 2

让我们考虑这两行:

代码语言:javascript
复制
char input[1];
gets(input);

假设输入是"test“。printf("%s\n",=> )测试“input1”,但如果我使用调试器,我看到input='t‘no ...到底发生了什么?

EN

回答 6

Stack Overflow用户

发布于 2009-05-13 20:39:59

那是缓冲区溢出仅供参考。有趣的是,在char input[1];之后添加char untouched[20];,还可以打印untouched。不要使用gets(),使用fgets()或其他带边界检查的东西。

调试器不显示input[1],因为没有这样的东西。您的char input[1];声明分配一个长度为1的数组,而不是从0到1的数组。

票数 10
EN

Stack Overflow用户

发布于 2009-05-13 20:43:17

gets(s)将一行从标准输入读取到s所指向的缓冲区中,直到出现终止换行符或EOF为止,并将其替换为'\0‘。不执行缓冲区溢出检查

http://linux.die.net/man/3/gets

当你执行gets时,输入被写入s所指向的缓冲区,然后添加一个\0。只有“t”在输入缓冲区内。其余的位于堆栈上的连续内存中。printf打印"test",因为它可以读取从s开始直到第一个\0的内容。但是"est\0“在缓冲区之外。

代码语言:javascript
复制
 ------
|  t  |  input - Debugger only sees this position.
 ------
|  e  |  Memory you are stepping onto. Trouble if it doesn´t belong to your proc.   
|  s  | 
|  t  |
|  \0 |
------

当您调试它时,input只指向一个char,所以这就是您所能看到的。

看一看的“No check for buffer overrun is buffer”是很重要的。这意味着get函数并不真正关心你是否已经为你的输入分配了内存。它将从您指定的点开始复制所有内容。如果你不小心,你的输入可能会影响到重要的信息。在一些最坏的情况下,这将是您的函数的返回地址(您正在使用gets)。“就是犯了这个错误”的人,会说"wtf正在进行中“。有意这样做的人会将您的返回地址指向特定的部分,并执行位于那里的代码。

More on Buffer Overflow.

票数 7
EN

Stack Overflow用户

发布于 2009-05-13 20:39:24

你溢出了你的缓冲区,这就是发生的事情。你正在写不属于你的内存,并且很幸运。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/860281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档