免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345
最近访问板块 发新帖
楼主: plp626
打印 上一主题 下一主题

[C] int (fun)(char *) 的问题 [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
41 [报告]
发表于 2012-09-28 16:45 |只看该作者
回复 40# plp626

看着你捉急,非要钻那牛角尖把自己往悬崖下面推,又没飞檐走壁的本事。这不是找屎嘛。。。


给你说了表这样写,直接用函数指针会死吗?
函数指针的指针,通常是用来做传出参数的,不是让你直接调用的。

你非要用。
用就用吧,也都给你说了10楼的代码是将foo的指令当作地址解释并跳转过去了。你还想怎样啊?
非要来个人把31楼那个你以为自己弄懂了于是反来过来考其他人的题回答了你才能满意才能获得成就感嘛?

这问题太初级了没人愿意理你啊楼主。。。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
42 [报告]
发表于 2012-09-28 16:50 |只看该作者
OwnWaterloo 发表于 2012-09-28 16:22
回复 31# plp626

我还是不知道反白内容是什么,我读at&t吃力于是就懒得看。


你虽然是调试成功了, 但实际也不是这样实现的吧。
照你这样, 其他函数就别想第一个指令是 addl   $0xc,0x4(%esp) 了

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
43 [报告]
发表于 2012-09-28 16:53 |只看该作者
但不排除编译器自己弄一个小函数, 里面只有一条 jmp 指令

论坛徽章:
0
44 [报告]
发表于 2012-09-28 16:56 |只看该作者
本帖最后由 plp626 于 2012-09-28 17:06 编辑

回复 41# OwnWaterloo

本想给你发消息,因为该回帖和讨论话题无关,但发现自己竟然没有发消息权限。。

    你的语言明显带着攻击性,讨论问题归讨论问题, 可否不要这么情绪化? 不过比较 哪些直接忽视这样的问题的看客, 我还是感谢每个回帖的人, 不管是怎样的“不屑”,起码我能看到交流

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
45 [报告]
发表于 2012-09-28 17:08 |只看该作者
回复 42# zylthinking

呃,调教。。。不是调试。。。
调试顺着编译器产生的代码走,是被动的。
调教是让编译器产生自己希望的代码,是主动的。。。


我参与这个楼的起因是看到31楼。 反白了一段汇编,要求不用调试器分析出原因。 头像还是高爷爷。。。
我就想啊,啥代码这么神秘,非调试器不可?

翻到10楼一看。。。  人肉都可以看出编译器会有警告了,怎么就有这么多人喜欢乱搞指针呢。。。
(*pfun)将pfun指向的地址解释为函数指针, 可pfun指向的是foo函数, 于是就将foo的指令的头4个字节当指针处理了, 自然跑飞。


10楼的要求是不改第10行。我加个函数指针变量,让它指向foo,再让pfun指向这个函数指针变量;可以了吧?
然后发现前面早有人这么回复了,恩,就是pm。。。

但LZ还在纠结。。。 后面还跟了这么多楼。。。  还要大家继续关注31楼。。。 有啥好关注的啊。。。


于是我尝试让foo的指令的前4个字节恰好也是一个指针,并且还就是foo的地址。
之前在windows上没调教成功。特地切换到linux下调教成功了,就是39楼。让pfun = foo; (*pfun)(""); 也成功调用了。
然后LZ又说我很有意思。。。  我不知道这楼还有什么有意思的东西。。。 索然无味啊。。。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
46 [报告]
发表于 2012-09-28 17:29 |只看该作者
回复 44# plp626

plp626 发表于 2012-09-28 16:56
本想给你发消息,因为该回帖和讨论话题无关,但发现自己竟然没有发消息权限。。


不必了。有什么你公开的说出来。

至于回帖与讨论是否有关不是你说了算的。
我不单没改10行的代码,而且还让:(*pfun) = foo; (*pfun)("");调用成功了。
我这是多顺着你的思路在走?你居然说与话题无关。


plp626 发表于 2012-09-28 16:56
你的语言明显带着攻击性,讨论问题归讨论问题, 可否不要这么情绪化?


我语气不好我承认。这些事你公开说就是了,没必要特地发短信悄悄说。

我给你说攻击性的来源:
plp626 发表于 2012-09-27 18:25
大伙谁能否分析下10楼代码的段错误缘由?
不准用调试器。。


一眼就看出问题的代码,用得着调试器吗? 你这一句"不准用调试器"让我感到智商受辱了。



plp626 发表于 2012-09-28 16:56
不过比较 哪些直接忽视这样的问题的看客, 我还是感谢每个回帖的人, 不管是怎样的“不屑”,起码我能看到交流


知道为什么被直接忽视吗? 因为这问题本身就有问题。
pfun = foo; (*pfun)(""); 本身就不是正规的代码。 已经可以让一部分人退出了: 我都不会写这种不规范的代码,凭什么要去管这种不规范代码产生的问题?
即使对那些想一探究竟的人, 这又不是什么很高深的问题, 而且你自己不是都发现问题在哪里了吗? 你还想怎样啊?



我正规回答你:

1. pfun = foo; pfun的值是foo的入口地址
2. ( (int (*)(char*)) pfun)(""); 就是用foo的入口地址调用, 所以就"成功了"。 这就是你在26楼的代码。
26楼的代码,先将 foo 转型为 (int (**)(char*), 然后又转回原来的(int (*)(char*)), 然后再调用。。。 差不多就是foo("");
这样的代码很有意思么?
我说差不多,是因为这代码只是恰好在i386上能运行而已, i386上恰好数据指针与函数指针是一样的而已。 C语言并没有要求它们必须一样。
3. (*pfun)("") —— 也就是10楼的代码。
*((T*)p) 就是将p的值,一个地址,上的内容按T来解析。
(*pfun)就是将pfun的值,现在pfun指向foo, 将foo上的内容 —— 原本是foo的指令 —— 按(int (*)(char*))来解析你说会不会出事情?

够了吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP