我试图将一个缓冲区溢出到另一个缓冲区作为实验来学习。
char* tmp_test = malloc(8);
char* tmp_test2 = malloc(8);
strcpy(tmp_test2,"ABCDEFG\n");
strcpy(tmp_test,"abcdefghijklmnopqrstuvxyz\n" );
printf("1th string %s" , tmp_test);
printf("2th string %s" , tmp_test2);
free(tmp_test);
free(tmp_test2);
我希望tmp_test能够流向tmp_test2,但这不会发生。
>1th string abcdefghijklmnopqrstuvxyz
>2th string ABCDEFG
>*** Error in `./Start': munmap_chunk(): invalid pointer: 0x00000000023bf860 ***
>Aborted
我在免费时收到错误,但其他一切看起来都很糟糕。
答案 0 :(得分:1)
这很可能是因为你只写了超过tmp_test容量的18个字节,并且两个块之间的松弛空间明显大于那个。
在每个块的标题中,C运行时存储了几个指针(它取决于实现,但可能多达3个),并且从错误消息中我推断出您在64位系统上,因此每个指针长度为8个字节,这意味着两个缓冲区之间的松弛空间可能是24个字节或更多。
此外,当运行时处于调试模式时,它会在块之间分配更多的死区,正是为了帮助检测缓冲区溢出。
所以,尝试使用更长的字符串,最终你会得到一个溢出到另一个字符串。
您还可以使用调试器来查看内存,并查看两个字符串在内存中的距离,以便计算出两个块之间有多少松弛空间而无需进行反复试验。
如果您想要试验的是缓冲溢出,那么请记住,它们在堆栈上分配的缓冲区中更常见,而不是从堆中动态分配。< / p>
答案 1 :(得分:0)
您的计划会调用undefined behaviour。人们无法预料会发生什么。在此程序中,当您尝试分配的元素多于分配的空间时,会导致UB。 &#34;我希望tmp_test能够流向tmp_test2&#34; - 你为什么期待这个?