gpt4 book ai didi

objective-c - 回到 sel_getUid() 的原始行为

转载 作者:太空狗 更新时间:2023-10-30 03:52:30 24 4
gpt4 key购买 nike

TL;DR:如何在不实际注册的情况下检查具有给定名称的选择器是否已注册?

谢谢!


你好,我有一个 Objective-C 应用程序和一堆 NSObjects,它们通过用 objc 编写的简单代理库导出到 Lua 状态。所有 Lua 端调用都像这样:

exported_objc_object:myMethodName(...)

-- same as --
exported_objc_object.myMethodName(exported_objc_object, ...)

-- same as --
key = 'myMethodName'
exported_objc_object[key](exported_objc_object, ...)

被转发,就好像有人调用:

[objc_object lua_myMethodName:L];

// declared as
- (int)lua_myMethodName:(lua_State *)L { ... }

实际上,Lua 导出对象上的任何“获取”操作码都会返回一个缓存的 Lua 闭包,调用时将通过使用 sprintf(s, "lua_%s:", key )) && sel_getUid(s)(包括所有检查)。如果生成的选择器未根据 -[respondsToSelector:] 实现,则 exported_objc_object.myMethodName 仅返回 nil

显然,代理库必须通过 sel_getUid()sel_registerName() 进行动态查找(我相信 @selectorNSSelectorFromString() 也在那里结束)。手册指出 sel_getUid() 旨在查找选择器名称(而不是立即将它们注册到 SEL 注册表中),但它的现代实现现在与 sel_registerName() 由于当时某人的 teh codez 中的错误。

我可以坚持使用 sel_registerName() 行为,但这会留下消耗内存的攻击向量,因为某些恶意脚本可能会开始通过 sml object[makeRandomKey 查找长随机/无效选择器()] 在一个循环中,因此永远溢出 SEL 注册表。如果 sel_getUid() 按计划工作,代理库将能够测试选择器是否存在,然后才实际检查对象是否响应它,而无需过多注册。但事实并非如此。

最佳答案

这里有一个可能有效的 hack,它使用了选择器是 C 字符串这一依赖于实现的事实。

sel_isMapped((SEL)(void *)"lua_myMethodName:")

关于objective-c - 回到 sel_getUid() 的原始行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29661994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com