从逆向分析角度看C++拷贝构造函数
作者:网络转载 发布时间:[ 2013/3/19 10:28:35 ] 推荐标签:
fun()函数的工作机制:
32: HowMany f(HowMany x) {
33: x.print("x argument inside f()");
004015DB push offset string "x argument inside f()" (0046f030)
004015E0 lea ecx,[ebp+0Ch]
004015E3 call @ILT+575(HowMany::print) (00401244)
34: cout << "Return From f()" << endl;
004015E8 push offset @ILT+200(std::endl) (004010cd)
004015ED push offset string "Return From f()" (0046f01c)
004015F2 push offset std::cout (0047ce98)
004015F7 call @ILT+660(std::operator<<) (00401299)
004015FC add esp,8
004015FF mov ecx,eax
00401601 call @ILT+480(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e5)
35: return x;
00401606 lea eax,[ebp+0Ch] ; [ebp+0C]为Temp的内存地址
00401609 push eax
0040160A mov ecx,dword ptr [ebp+8] ; [ebp+8]为h2的内存地址,ecx指向h2内存块
0040160D call @ILT+0(HowMany::HowMany) (00401005) ; 调用拷贝构造函数,将Temp的内容拷贝到h2的内存中
00401612 mov ecx,dword ptr [ebp-10h]
00401615 or ecx,1
00401618 mov dword ptr [ebp-10h],ecx
0040161B mov byte ptr [ebp-4],0
0040161F lea ecx,[ebp+0Ch] ; ecx保存Temp的内存地址
00401622 call @ILT+500(HowMany::~HowMany) (004011f9) ; 调用析构函数,销毁Temp
00401627 mov eax,dword ptr [ebp+8] ; eax保存h2的内存地址
36: }
对于运行结果
解析如下:
1、对象h调用构造函数
2、输出字符串“Entering f()”
3、在进入f()函数之前,创建了一个临时对象Temp,调用拷贝构造函数,将对象h的内容拷贝到Temp中
4、进入f()函数,在执行“return x”语句后,调用拷贝构造函数,将对象Temp的内容拷贝到h2中(完成了h2 = f(h)的工作)
5、在f()函数结束前,为Temp调用析构函数,销毁Temp对象
6、退出f()函数,在main函数结束前,先销毁对象h2,后销毁对象h
----------------------------------------------------------------------------
逆向分析时执行“HowMany h2 = f(h);”语句过程中栈分布的记录:
*****
进入f()函数前(创建了一个临时对象Temp,调用拷贝构造函数,将对象h的内容拷贝到Temp中)
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11