免费注册 查看新帖 |

Chinaunix

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

C语言对闭包运算的支持 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2011-12-04 23:37 |只看该作者
回复 49# zylthinking


我可以理解成, 这是在夸我吗?

论坛徽章:
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
52 [报告]
发表于 2011-12-04 23:44 |只看该作者
virtualprotect做为公开api, 不可能让它崩溃的。不崩就对了

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
53 [报告]
发表于 2011-12-04 23:46 |只看该作者
回复 52# davelv


我不感兴趣仅仅是因为它是一个gcc扩展, 也就是说源代码很可能就没法用别的编译器编译, 产生的代码也许也没法同别的编译器产生的代码交互。
对这个技术本身还是感兴趣的。


诶……  怎么会…… 如果你还对这个感兴趣的话, 要不试试:
1. i386
2. windows开启DEP
3. 下面的代码:

  1. int main(void)
  2. {
  3.       ((void (*)(void))"\xc3")();
  4.       return 0;
  5. }
复制代码
应该是会触发DEP的……




如果上面的代码会触发, 但你在1楼帖的代码不会, 那可能是gcc实现方式有变化。
如果上面的代码也不会触发……  我也不知道为什么了………………

论坛徽章:
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
54 [报告]
发表于 2011-12-05 00:07 |只看该作者
为什么一定解释成栈上即时分配可执行代码呢, 这解释本身就有些不自然,应该是编译期生成,至于为什么不能在其他地方用,想想function内的static变量。

论坛徽章:
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
55 [报告]
发表于 2011-12-05 12:32 |只看该作者
为什么一定解释成栈上即时分配可执行代码呢, 这解释本身就有些不自然,应该是编译期生成,至于为什么不能在 ...
zylthinking 发表于 2011-12-05 00:07


靠, 还真是在栈上耍花招了, 看了半天反汇编, 才看明白

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
56 [报告]
发表于 2011-12-05 12:55 |只看该作者
代码估计还是在text域,栈上面应该是个小thumb(WTL那种),至于为嘛在栈上分配。因为忘了是哪个规定的了,栈上的内存应该是可读可写可执行的。

论坛徽章:
0
57 [报告]
发表于 2011-12-05 12:59 |只看该作者
回复 1# davelv


    Gcc扩展是允许你这么干的,甚至可以允许你在C里面实现尾递归。不过这种尝试对C语言来说没有太大的实际意义,也不会有人真的拿C这么用的。

论坛徽章:
0
58 [报告]
发表于 2011-12-05 13:48 |只看该作者
回复 55# OwnWaterloo

这个在windows下的确会崩,Linux下没有崩。
PE和ELF文件对段的处理方式也不尽相同。

论坛徽章:
0
59 [报告]
发表于 2011-12-05 13:58 |只看该作者
回复 57# zylthinking

mingw比我在Linux下用的原生gcc行为更怪异,它是在文本段为每一个库函数调用都生成了一小块代码。

论坛徽章:
0
60 [报告]
发表于 2011-12-05 14:34 |只看该作者
回复 41# davelv

代码稍微简化了一下。

函数f返回符合声明的函数指针。

我觉得还不是闭包。注释里的代码是等价的。

  1. /*
  2. int n(int y)
  3. {
  4.   return y<<1;
  5. }

  6. int (*f(void))(int x)
  7. {
  8.   return n;
  9. }
  10. */

  11. int (*f(void))(int x)
  12. {   
  13.   int n(int y)
  14.   {   
  15.     return y<<1;
  16.   }
  17.   return n;
  18. }

  19. #include <stdio.h>

  20. int main(void)
  21. {
  22.   printf("%d\n",f()(5));
  23. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP