无聊问个怪现象

dengqibin 2011-10-11 04:26:33

class TestA
{
public:
TestA()
{
std::cout << "constructor";
}
void Fun()
{
std::cout << "test";
}
};
int main()
{
TestA *p = NULL;
p->Fun();

return 0;
}

居然对了,输出了test
...全文
121 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2011-10-11
  • 打赏
  • 举报
回复
可以看看inside the c++ object model这本书
chengwenyao18 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luciferisnotsatan 的回复:]
引用 2 楼 kaile 的回复:

DEBUG下可能没问题,有自动纠错机制。

release下必错。

另外不知道LZ为什么这样做

release下也没问题。因为Fun没有用到成员变量,也就是没有用到隐藏的this指针,所以也就不会有问题。

void Fun() 被编译器翻译为类似与 void Fun(TestA *this)这样的函数。
而p->Fun(); 就类似……
[/Quote]
正解。。。
Qlaiaqu 2011-10-11
  • 打赏
  • 举报
回复
可以这么做,但是不要这么做。
kusey 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luciferisnotsatan 的回复:]
release下也没问题。因为Fun没有用到成员变量,也就是没有用到隐藏的this指针,所以也就不会有问题。

void Fun() 被编译器翻译为类似与 void Fun(TestA *this)这样的函数。
而p->Fun(); 就类似与 Fun(p);

没用到p,也就什么问题都没有。
[/Quote]

学习了!
dengqibin 2011-10-11
  • 打赏
  • 举报
回复
呵呵,多谢解释,只是无聊写差玩的,写这样的代码会被人K死的[Quote=引用 4 楼 luciferisnotsatan 的回复:]
引用 2 楼 kaile 的回复:

DEBUG下可能没问题,有自动纠错机制。

release下必错。

另外不知道LZ为什么这样做

release下也没问题。因为Fun没有用到成员变量,也就是没有用到隐藏的this指针,所以也就不会有问题。

void Fun() 被编译器翻译为类似与 void Fun(TestA *this)这样的函数。
而p->Fun(); 就类似……
[/Quote]
luciferisnotsatan 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yakeezhao 的回复:]

成员函数的特性。因为不是虚函数,Fun()的地址是固定存在的,即查找只不过是个固定偏移查找问题。把 void Fun() 改成 virtual void Fun() 试试,保证crash掉。 建议学习成员函数及成员函数指针内容。
[/Quote]
加了virtual,也就用到了隐藏的成员变量(虚指针)去查找函数地址。p是null,也就访问违规了。
dengqibin 2011-10-11
  • 打赏
  • 举报
回复
不是偶然的,不信你也试试[Quote=引用 1 楼 namelij 的回复:]
呃,偶然性,运气好
[/Quote]
yakeezhao 2011-10-11
  • 打赏
  • 举报
回复
4楼正解。
luciferisnotsatan 2011-10-11
  • 打赏
  • 举报
回复
当然,没事别写这种代码。
yakeezhao 2011-10-11
  • 打赏
  • 举报
回复
成员函数的特性。因为不是虚函数,Fun()的地址是固定存在的,即查找只不过是个固定偏移查找问题。把 void Fun() 改成 virtual void Fun() 试试,保证crash掉。 建议学习成员函数及成员函数指针内容。
turing-complete 2011-10-11
  • 打赏
  • 举报
回复
静态绑定且没有数据成员的时候,这个就是对的,没有偶然因素。
luciferisnotsatan 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kaile 的回复:]

DEBUG下可能没问题,有自动纠错机制。

release下必错。

另外不知道LZ为什么这样做
[/Quote]
release下也没问题。因为Fun没有用到成员变量,也就是没有用到隐藏的this指针,所以也就不会有问题。

void Fun() 被编译器翻译为类似与 void Fun(TestA *this)这样的函数。
而p->Fun(); 就类似与 Fun(p);

没用到p,也就什么问题都没有。
turing-complete 2011-10-11
  • 打赏
  • 举报
回复
这是运气好的问题吗?!
Kaile 2011-10-11
  • 打赏
  • 举报
回复
DEBUG下可能没问题,有自动纠错机制。

release下必错。

另外不知道LZ为什么这样做
  • 打赏
  • 举报
回复
呃,偶然性,运气好
注明:转发 软件作者:老费 2007/5/26:增加了文件头多态功能,在文件头入口以及异或部分,增加了多态模块,如果你在设置中选择了多态,会在这2个部分增加随机的代码(每次捆绑都不同),以达到防止一定程度的特征码定位。PS:这里的多态玩具性质大于实用性,对AVER没什么挑战性,但无论怎么说,I DONE IT :) 版本号升级为:1.2 大家如果对程序有什么疑问或希望程序往哪个方面发展,请就在邪八这里跟帖告诉我,THX 当然,最重要的是,如果有BUG,一定要记得告诉我哈。 MD5: 48d42c46d11f9eb4e836d94cc08359e1 Ek Chuah 1.2.exe 2007/5/9:修改了解绑方式. 2007/5/7: 大家好,5/1过的怎么样? 我在这里给大家带来一个捆绑工具,5/1在公司加班的时候无聊写的。 在2K 和 XP SP2 下初步测试了一下。 注意点:解捆绑时,会在系统目录下建立文件,所以要有相应的操作权限才行。其他没什么可说的,具体看软件说明吧。还有,对有些文件,比如eBook Workshop压成的电子书,某些自解压文件,某些古怪的壳,作为宿主出现,可能会不行,还在改善中... 因为我测试的不是很仔细,如果有什么BUG请跟帖,说明操作系统,具体情况,最好能给出待捆绑文件/宿主文件,或捆绑后的文件。我会尽快完善。 因为最近出差比较多,上网机会会少点,大家有问题在这里发帖,或去我的站发都可以,我一有时间就会上来看滴。 如果有好的建议也一定要告诉我哈 希望大家喜欢 :) ;********************************************************** MD5:987f5706325dec1d4fcfae2503dbdcf3 Ek Chuah.exe 软件说明: 版本号:1.0版 软件作者:老费 技术支持:EChuah.bloggles.info 软件的设置以及使用方法如下: 1>在软件界面左侧相关设置栏,选中它显示当前所有设置,并可以对当前设置进行测试是否正确,测试正确后可以点击"开始合并"进行合并。 2>双击"相关设置"展开"基本设置"和"高级设置" 3>在基本设置中有3个设置项目,1:待合并文件:就是你要合并到其他文件上去的可执行文件;2:宿主文件:就是要被待合并文件插入的文件,合并前请先备份; 3:合并模式,一,搜索多余字节,在宿主文件中搜索00字节,尝试把待合并文件分散插入到00字节中去,这种合并方式适合宿主文件较大,而待合并文件较小的情况。优点是宿主文件合并前后字节不变。 二,扩展最后一节表,把宿主文件的最后一个节表增加待合并文件的大小,然后写入,需要注意,如果宿主文件不是纯PE文件,如那种安装包或加了某些壳,这种情况下就不适用。 三,在宿主文件末端增加一个新节。上面2种都不行的话,只有试试这个了。 4>高级设置有3项,1:入口点模糊EPO深度,如果你对这个概念不清楚,可以到网上查,或者保持默认设置:0,众所周知,我们要在宿主运行时获得控制权来做我们要做的事,至于什么时候获得控制权就是这个选项的事了,如果它为0,我们将在宿主程序的入口点获得控权,当他不为0,我们将从入口点开始搜索指令,第n(n就是设置的数)条指令时我们将获得控制权并把文件解绑,运行,作用?防止一定程度的入口点定位。如果你要改变这个设置,请确定你有足够了解宿主的结构,如果不确定,请保持为0。PS:无论你设置多少数字,我们只对入口点开始的100字节进行搜索(正常来说足够了)。这里指的第N条指令,是物理意义上的,而不是逻辑意义上的,也就是说,如果你定位了一个指令,而这个指令在宿主程序的逻辑中是没什么机会被执行的,比如:出某个错误时的处理,那么,我们也就没什么机会拿到控制权了。当然,这也意味着,请注意。如果你有创意,完全可以在当宿主结束的那一刻,启动你的小东西。:) 2:文件体加密:这个很简单,就是随机取一个种子,把它和待捆绑文件进行XOR运算进行加密。 3:文件头多态:这个就不多说了,下个版本提供时再详细说明,会对取特征码的手法做些遏制。 一般的应用,进基本设置,设置好文件路径,到相关设置处测试一下设置,根据反馈调整一下,一般就是调整一下合并模式,就OK了。高级设置都不用管,默认就OK了。 特别注意,没有对合并后的文件做标记,如果对已经合并过的文件反复进行合并,也许会出现奇怪的不可预计的现象. 2007/05/01 劳动节,OT中... 尾声:这个东西我做了1个星期,因为时间仓促,很多方面没考虑,考虑下个版本会增强某几个方面,第一是文件解绑部分实现多态,来对付特征码定位,还有就是对部分主流杀软的所谓动态监控做些处理。更重要的我想在大家帮忙的测试下,把稳定性和兼容性能进一步提高。当然,这些前提是有人需要的话,我不知道现在大家还是否需要捆绑器???或者特别需要哪些功能的捆绑器。。。

64,281

社区成员

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

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