帮忙看段代码,THX

delphiwcdj 2010-10-22 03:58:27

#include <cstdio>
void print();
int count=1;
int main()
{
print();
return 0;
}

void print()
{
unsigned long *p=(unsigned long*)&p;
p+=3;// 这个值和编译器有关
*p=(unsigned long)print;
if(count <= 1000)
printf(" %d\n",count++);
// else
// {
// printf("===%d===\n",count);
// exit(0);
// }
}

在vs2008下调试,输出到89就自动退出了,请问这是原因?
分数不多请见谅!
...全文
193 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
superarhow 2010-10-25
  • 打赏
  • 举报
回复
= = 打错了,堆栈不是一直往后退,是一直往前移
superarhow 2010-10-25
  • 打赏
  • 举报
回复
其实原因就是9楼所讲的.
修改p,相当于是修改call指令压入的返回值地址,但实际上原本每一次call和ret,一个压入4字节,一个弹出4字节是配对的,但是通过修改ret地址达到call的效果实际上让原本应该再执行的call没有执行.但每次的ret又会弹出4字节,堆栈就在一直往后退.直到把连main函数的堆栈都用掉了之后,就会出现AV.如果在main函数中添加点padding的可以保证运行一定次数,但是始终没办法无限循环.
不知道偶是否表达清楚了.LZ可以把p的地址每次都打印出来看看.
delphiwcdj 2010-10-25
  • 打赏
  • 举报
回复
谢谢大家!结贴
ocean1004 2010-10-25
  • 打赏
  • 举报
回复
我在vs2008中文版下,输出到90
ocean1004 2010-10-25
  • 打赏
  • 举报
回复
不懂,但是为什么 unsigned long *p=(unsigned long*)&p; 这句是可以的?
是什么意思?能不能告诉我一下
delphiwcdj 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 superarhow 的回复:]

int main()
{
char padding[10000];
print();
return 0;
}

============= main函数这样改,release版本,stack checking全关,可以打印到999
原因自己想
[/Quote]
或者改为: *p-=5;就对了。
luciferisnotsatan 2010-10-22
  • 打赏
  • 举报
回复
估计是函数调用时的CALL指令暗含了一个将返回地址(即CALL指令下一条指令的地址)压栈的动作。而后面通过修改栈,ret时却少了这个压栈动作。导致出入栈不平衡了,每次esp多加了4
赵4老师 2010-10-22
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
superarhow 2010-10-22
  • 打赏
  • 举报
回复
int main()
{
char padding[10000];
print();
return 0;
}

============= main函数这样改,release版本,stack checking全关,可以打印到999
原因自己想
luciferisnotsatan 2010-10-22
  • 打赏
  • 举报
回复
dubeg下,p的地址每次都会+4,起初内存里都是cc,但后来就出现些数据了。
大石头1987 2010-10-22
  • 打赏
  • 举报
回复
期待高手。好像是指针访问违规!但具体跟了一下也不知道怎么回事。0x00130000 是什么特殊地址吗?
delphiwcdj 2010-10-22
  • 打赏
  • 举报
回复
.................
delphiwcdj 2010-10-22
  • 打赏
  • 举报
回复
在vc6下输出53,要改为+2
delphiwcdj 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 evoloyeu 的回复:]

在return前加上getchar();
[/Quote]
谢谢,好像不是哦
evoloyeu 2010-10-22
  • 打赏
  • 举报
回复
在return前加上getchar();

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧