易码技术论坛

 找回密码
 加入易码
搜索
查看: 142446|回复: 8

C/C++中的函数指针 在LAVA纯软件条件下不可实现性分析

[复制链接]
发表于 2005-5-27 09:15:00 | 显示全部楼层
LavaX没有指针类型,何来函数指针?
发表于 2005-5-27 11:46:00 | 显示全部楼层
最经典的指针都没有  哎
发表于 2005-5-27 11:56:00 | 显示全部楼层
指针是万恶之源。
引用代替指针有效而且安全!
发表于 2005-5-27 22:07:00 | 显示全部楼层
那为什么不把指针彻底从编程的领域清除掉呢?
发表于 2005-5-28 16:49:00 | 显示全部楼层
以下是引用leesoft在2005-5-27 11:56:58的发言:

指针是万恶之源。

引用代替指针有效而且安全!


为什么?[em06]
发表于 2005-5-29 19:03:00 | 显示全部楼层
因为有指针就能嵌入汇编.
 楼主| 发表于 2005-5-30 22:53:00 | 显示全部楼层
此指针非彼指针也。。。
这是字节码的指针
发表于 2005-5-31 00:30:00 | 显示全部楼层
指针是好东西,不要亵渎它!
 楼主| 发表于 2005-5-26 23:03:16 | 显示全部楼层 |阅读模式
C/C++中的函数指针 在LAVA纯软件条件下不可实现性分析

     by sippey

C/C++中利用函数指针是非常有用的一项特性,但经证明,纯粹的函数指针跳转在LAVA纯软件条件下不可能实现。

我所说的纯粹的函数指针跳转有两大特点,一是指向必须具有在运行时也具有随意性,二是必须在callee(被调函数)对程序编写者不可见(不知其内部信息,只知道调用参数及返回值)。

下面我们开始分析,假设题设为假,即有可能实现,那么函数指针必须要实现执行路径的跳转,即改变IP的值。在LAVA中可以完成这样的任务的代码只有三条,goto、call、ret。其中goto, call 为立即寻址,不能满足要求。因此只有ret可能在与一些其他代码合作的情况下完成此项任务。

为简化问题,我们暂且不分析其他的步骤,只分析跳转的核心步骤----ret。

1.在某一个ret后,执行路径将转到callee。那么在执行ret前,虚拟机的bp必然指向callee的地址。

2.在执行完此ret后bp'=old_BP,sp'=bp。此时执行callee的第一条命令func(类似于x86的enter)

3.执行完func之后bp"=sp'=bp 恰为 1 中的bp 也就是说 在callee执行完返回时必然返回到callee的开头重新执行。

此步骤只涉及ret,func两条指令,其间不可能插入任何指令,因此题设成立。

------------------
P.S.

1.虽然函数指针用来调用不能实现,但是用于跳转却是有可能的。这是因为跳转不涉及返回地址及栈祯的变化。
2.可以用指针跳转+其他技巧的办法来实现伪函数指针调用,这在LAVA这样几乎严格以函数为单位的程序架构中,虽然不能代替前面提到的那种无所不能的“纯粹的函数指针”的所有功能,但是也是可以完成绝大多数的功能的。
3.本文讨论的是“在纯软件条件下”,LAVA程序是在虚拟机上运行的,我把虚拟机看作是硬件。在修改虚拟机参数甚至是代码的条件,函数指针可以完全被实现。但是修改虚拟机会使程序失去跨平台性,还不如用6502写呢,呵呵。


您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-5-19 23:13 , Processed in 0.011093 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表