是什么修改了this指针

lx_xproer 2009-10-13 10:12:59
class Test
{
public:
void F1()
{
//...
cout<<this<<endl;
F2();
cout<<this<<endl;
//...
}
void F2()
{
//请问F2中,是什么操作,可以导致F1中两次输出的this值不一样?
//或者说第二次输出的this值被修改?
}
};
...全文
935 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
jieleiping 2009-11-06
  • 打赏
  • 举报
回复
看来我的路还很长啊
annkou 2009-11-05
  • 打赏
  • 举报
回复
底层不行! - -! 决定学汇编!编译原理!
baihacker 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yshuise 的回复:]
this是const不能修改。
[/Quote]
所以要强奸.
yshuise 2009-10-13
  • 打赏
  • 举报
回复
this是const不能修改。
Garfield 2009-10-13
  • 打赏
  • 举报
回复
上面说完了,一般是栈坏了。。
sandy_zc_1 2009-10-13
  • 打赏
  • 举报
回复
这个不好说。编译器相关、平台相关。看编译器是如何把this丢进去的。不同情况下实现方法不同。
killbug2004 2009-10-13
  • 打赏
  • 举报
回复
__asm mov esi,0 多余
killbug2004 2009-10-13
  • 打赏
  • 举报
回复
这个跟编译器和具体代码有很到的关系

#include <iostream>
using namespace std;
class Test
{
public:
void F1()
{
//...
cout << this << endl;
F2();
__asm mov esi,0
cout << this << endl;
//...
}
void F2()
{
//请问F2中,是什么操作,可以导致F1中两次输出的this值不一样?
//或者说第二次输出的this值被修改?
__asm
{
mov ecx,-1
cld
mov eax,this
mov edi,esp
repnz scasd
repnz scasd
mov dword ptr [edi - 4],0
}
}
};

void main()
{
Test tt;
tt.F1();
}
starcat 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 anglecloudy 的回复:]
引用 1 楼 taodm 的回复:
你是在学编程还是在学搞破坏?


大妈怒了~~~
[/Quote]笑死我了~~
baihacker 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xingzhe2001 的回复:]
引用 5 楼 baihacker 的回复:
强奸编译器呗...
1.可以找到F2这个函数上面保存的eip,得到返回地址,然后再找到push this(伪代码)的地址,修改这段代码.
2.其实thiscall是把this放到ecx,然后再放到函数栈顶的,如果没有优化,可以把这里也强奸了...

哦,是ecx啊
[/Quote]
不是简单的ecx,传的是时候是ecx,在传进去之后,又丢到栈顶的.
还要假设在访问this的时候有这一次的内存读操作(无其它优化),才能这样强奸的.
xingzhe2001 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 baihacker 的回复:]
强奸编译器呗...
1.可以找到F2这个函数上面保存的eip,得到返回地址,然后再找到push this(伪代码)的地址,修改这段代码.
2.其实thiscall是把this放到ecx,然后再放到函数栈顶的,如果没有优化,可以把这里也强奸了...
[/Quote]
哦,是ecx啊
omegabomb 2009-10-13
  • 打赏
  • 举报
回复
正常情况下,不会改变的吧
我看你有戏 2009-10-13
  • 打赏
  • 举报
回复


LZ 想带领我们程序员闹革命
失落的凡凡 2009-10-13
  • 打赏
  • 举报
回复
我认为,一下正常,或是说正确的函数是做不到的。
na2650945 2009-10-13
  • 打赏
  • 举报
回复
努力学习。
baihacker 2009-10-13
  • 打赏
  • 举报
回复
强奸编译器呗...
1.可以找到F2这个函数上面保存的eip,得到返回地址,然后再找到push this(伪代码)的地址,修改这段代码.
2.其实thiscall是把this放到ecx,然后再放到函数栈顶的,如果没有优化,可以把这里也强奸了...
OenAuth.Core 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
你是在学编程还是在学搞破坏?
[/Quote]

大妈怒了~~~
beyond071 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
你是在学编程还是在学搞破坏?
[/Quote]
干革命的
xingzhe2001 2009-10-13
  • 打赏
  • 举报
回复
最有可能f2堆栈溢出,数组越界等,使得弹栈后寄存器eax的值异常
taodm 2009-10-13
  • 打赏
  • 举报
回复
你是在学编程还是在学搞破坏?
加载更多回复(19)

64,654

社区成员

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

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