免费注册 查看新帖 |

Chinaunix

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

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

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

好嘛, 你还真敢用……

你这么一说我有印象了, 关于杀毒软件的良心……


你有分配可执行内存吗? 比如用VirtualAlloc/mmap什么的?
如果因为用了这两函数杀毒软件就报警那也太不可思议了点……   内存分配最终肯定要调用VirtualAlloc(或者MappingViewOfFile)
posix 可能sbrk比mmap用得多。
但杀毒软件, 应该是指Windows吧? 杀毒软件是怎么知道 VirtualAlloc 是被谁调用的? 是被malloc调用, 还是被你的代码调用?
如果malloc里面的VirtualAlloc调用它都敢报, 那没什么软件它不能报的……


有这么一种可能性。 windows 某几个dll只能加载到固定地址, malloc(in msvcrt.dll)肯定不属于这类。
malloc(in  msvcrt.dll) 记得是调用 HeapXXXX 那一堆函数, 我忘了这堆函数是在哪个dll以及这些dll有没有固定地址。
如果有, 杀毒软件就可以用这个做依据, 只有一段地址上的目的地址是VirtualAlloc的call调用是被允许的, 其他就会报告。


如果杀毒软件是因为数据执行保护而报告就是你偷懒了……
我机器上数据执行保护是开着的, lz的代码即使杀毒软件不报告, Windows也会报告的……

论坛徽章:
0
12 [报告]
发表于 2011-11-30 20:15 |只看该作者
回复 5# OwnWaterloo

用gdb调试了下,的确在gcc下是会这样子处理撒。如果开启DEP的话,应该会crash吧。我去找个有DEP的机器测试下。
话说那个分号阿,其实一开始我函数只有声明没定义,后来把声明改成定义的时候分后就遗留下来了。

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

哦, 分号可以这样用。

  1. R f(param...)
  2. //*  开启注释就是声明, 关闭注释就是定义
  3. { }
  4. //*/
  5. ;
复制代码

论坛徽章:
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
14 [报告]
发表于 2011-11-30 21:46 |只看该作者
没做调查,但我怀疑是挂钩virtualprotect了。

论坛徽章:
0
15 [报告]
发表于 2011-11-30 22:35 |只看该作者
回复 14# OwnWaterloo

竟然被你发现了。。

话说我开启了PAE,开启了exec-shield,开启了SELinux,程序仍然可以正常编译执行。
但是一旦我在编译器中用-z noexestack指定stack不执行的话,立刻出错了(ELF文件的栈段没有X权限)。

话说这是不是表明exec-shield不会覆盖elf文件的segment权限。

论坛徽章:
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
16 [报告]
发表于 2011-11-30 22:40 |只看该作者
对dep没概念, 想的就是即然公开了调用就不该阻止我用。 报毒后才意识到这是人家的江湖, 懒得找原因了做试验了, 直接弄个全局变量了了事

论坛徽章:
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
17 [报告]
发表于 2011-11-30 23:10 |只看该作者
viryualalloc也未必行,得研究ldr系列实现恐怕才能找到杀毒软件的忌惮api,或许mapviewoffile可行, 垃圾safari, 玩闪退

论坛徽章:
0
18 [报告]
发表于 2011-12-01 02:39 |只看该作者
最简单的 C++ 演示:

  1. int main()
  2. {
  3.     [](){}();
  4.     return 0;
  5. }
复制代码

论坛徽章:
0
19 [报告]
发表于 2011-12-01 10:26 |只看该作者
回复  OwnWaterloo

用gdb调试了下,的确在gcc下是会这样子处理撒。如果开启DEP的话,应该会crash吧。我 ...
davelv 发表于 2011-11-30 20:15


不是很肯定gcc如何处理Nested-Functions。
http://gcc.gnu.org/onlinedocs/gc ... ml#Nested-Functions

论坛徽章:
0
20 [报告]
发表于 2011-12-01 15:47 |只看该作者
这种内部函数定义不是闭包。

c89不支持这种语法。

http://en.wikipedia.org/wiki/Nested_function

无论如何,学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP