【发布时间】:2016-07-03 13:17:14
【问题描述】:
#include<stdio.h>
int main(){
char A[10];
char B[10];
sprintf(A,"Hello");
sprintf(B,"AAAAAAAAAABBBBBBBBBBCCCCCCCCCC");
printf("%s:%s\n",A,B);
return(0);
}
(gdb) p &A
$1 = (char (*)[10]) 0x7fffffffe450
(gdb) p &B
$2 = (char (*)[10]) 0x7fffffffe440
(gdb) step
2: B = "AAAAAAAAAA"
1: A = "BBBBCCCCCC"
printf o/p- BBBBCCCCCCCCCC:AAAAAAAAAABBBBBBBBBBCCCCCCCCCC
问题-
A 在堆栈帧中首先出现,B 在后面。如果 B 覆盖 A,那么所有 "BBBBBBBBBB" 都应该进入 A 为什么 A 从 "BBBBCCCCCCCCCC" 开始?
另外我想知道如果我覆盖BP,程序会终止吗?
【问题讨论】:
-
因为堆栈向上增长,这就是为什么 A 从 BBBBCCCCCCCCCC 盯着看
-
你们为什么对未定义的行为如此着迷?没有人说编译器必须以特定方式将这些自动变量放在内存中。他们甚至不需要在内存中! C 中不需要有栈!
-
但是A应该从“BBBBBBBBBB....”开始
-
'在我的系统和环境中解释你没有的 UB'。 DCV:(
-
@AnttiHaapala 这可能是家庭作业。教授/助教在学期开始时设置了这样的作业,看看谁在作弊 - 'AAAAAAAAAABBBBBBBBBBCCCCCCCCCC' 字符串很容易被脚本在线发现,而且误报很少。