我正在关注“粉碎堆栈以获取乐趣和利润”http://insecure.org/stf/smashstack.html。
我想知道为什么我的代码工作正常,虽然我写了它来制作分段错误。
#include <stdio.h>
#include <string.h>
void function(char *str){
char buffer[16];
strcpy(buffer, str);
}
int main(void)
{
char large_string[256];
int i;
for(i = 0; i < 255; i++)
large_string[i];
function(large_string);
return 0;
}
答案 0 :(得分:6)
这只是因为你的large_string
未正确初始化:它包含垃圾,其长度(直到'\0'
的字节数)最可能远小于256(例如在我的机器上第四个字节) large_string
的值为零,因此strcpy
只复制4个字节。)
成功
for(i = 0; i < 254; i++)
large_string[i] = 'A';
large_string[255] = '\0';
你会得到分段错误。
答案 1 :(得分:1)
可能实施发生以将large_string
初始化为全零。并且strcpy
实际上复制了一个空字符串。
for(i = 0; i < 255; i++)
large_string[i] = 'a';
这会导致分段错误。
答案 2 :(得分:0)
您正在初始化large_string[256];
中的字符串,然后浏览它的项目。你没有通过数组的限制,所以没有分段错误。
如果您将值放入数组中,则程序将崩溃,因为strcpy
将超出范围
答案 3 :(得分:0)
您尚未正确初始化large_string
。
在for循环之后,在数组\0
的末尾添加可能有帮助的空字符。
large_string[255] = '\0';
最好初始化数组,而不是现在它正在放置垃圾值。
for(i = 0; i < 255; i++)
large_string[i] = 'a';
修改:
正如评论中所述,junix说 - 更重要的是,至少有16个字节的\0
比在字节255处有一个\ 0来引发堆栈粉碎;-)