让我们考虑这两行:
char input[1];
gets(input);假设输入是"test“。printf("%s\n",=> )测试“input1”,但如果我使用调试器,我看到input='t‘no ...到底发生了什么?
发布于 2009-05-13 20:39:59
那是缓冲区溢出仅供参考。有趣的是,在char input[1];之后添加char untouched[20];,还可以打印untouched。不要使用gets(),使用fgets()或其他带边界检查的东西。
调试器不显示input[1],因为没有这样的东西。您的char input[1];声明分配一个长度为1的数组,而不是从0到1的数组。
发布于 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“在缓冲区之外。
------
| 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.
发布于 2009-05-13 20:39:24
你溢出了你的缓冲区,这就是发生的事情。你正在写不属于你的内存,并且很幸运。
https://stackoverflow.com/questions/860281
复制相似问题