Lua,我可以禁用 C++ 中的部分语言吗?
Lua, can I disable parts of the language from C++?
假设我在 C++ 应用程序中嵌入了 Lua。这个问题听起来可能很奇怪,但我很感兴趣,是否有 标准 方法来禁用 C++ 端的 Lua 功能?
例如,除了一些已定义的变量外,我想禁用新变量的创建,如下所示:
local time = 10
local size = 20
function test()
return time * size
end
如果我定义 time
、size
和 test
函数以外的任何其他函数,我想让 Lua VM 失败。这可能不是破解 VM 本身吗?
或者例如我想禁用循环(for
和 while
语句)。
一种选择是获取 Lua source code 并删除不需要的部分。它并不像听起来那么疯狂:代码非常可读。
不,没有任何用于禁用语言核心功能的标志。而且不可能以任何合理的方式为 "only allow X variables" 设置编译时标志。
修改 lua 以删除 for
和 while
可能相当简单,但将其修改为不允许创建变量可能不会(我认为可能不会)非常简单简单。
我认为 metalua 这样的东西实际上会使这类事情变得更容易。
限制可以创建或访问的 global 变量的名称很容易:只需将脚本加载到具有 __index
和 [= 的适当元方法的环境中即可11=].
限制 local 变量的名称需要一些深入的黑客攻击,可能不值得,因为它们不会影响主机程序。
限制关键字不能立即完成,但可以通过一些简单的 hack 来完成:
要删除一些关键字,只需在llex.c中的luaX_tokens中的相关字符串中添加一个space即可。这些关键字将可用于变量名,相应的语法结构将不可访问并会引发错误。例如,要删除循环,请禁用 for
、while
和 repeat
。你可以离开 in
和 until
,但他们不会做任何事情。如果您想动态执行此操作,请参阅 this lua-l message。
假设我在 C++ 应用程序中嵌入了 Lua。这个问题听起来可能很奇怪,但我很感兴趣,是否有 标准 方法来禁用 C++ 端的 Lua 功能?
例如,除了一些已定义的变量外,我想禁用新变量的创建,如下所示:
local time = 10
local size = 20
function test()
return time * size
end
如果我定义 time
、size
和 test
函数以外的任何其他函数,我想让 Lua VM 失败。这可能不是破解 VM 本身吗?
或者例如我想禁用循环(for
和 while
语句)。
一种选择是获取 Lua source code 并删除不需要的部分。它并不像听起来那么疯狂:代码非常可读。
不,没有任何用于禁用语言核心功能的标志。而且不可能以任何合理的方式为 "only allow X variables" 设置编译时标志。
修改 lua 以删除 for
和 while
可能相当简单,但将其修改为不允许创建变量可能不会(我认为可能不会)非常简单简单。
我认为 metalua 这样的东西实际上会使这类事情变得更容易。
限制可以创建或访问的 global 变量的名称很容易:只需将脚本加载到具有 __index
和 [= 的适当元方法的环境中即可11=].
限制 local 变量的名称需要一些深入的黑客攻击,可能不值得,因为它们不会影响主机程序。
限制关键字不能立即完成,但可以通过一些简单的 hack 来完成:
要删除一些关键字,只需在llex.c中的luaX_tokens中的相关字符串中添加一个space即可。这些关键字将可用于变量名,相应的语法结构将不可访问并会引发错误。例如,要删除循环,请禁用 for
、while
和 repeat
。你可以离开 in
和 until
,但他们不会做任何事情。如果您想动态执行此操作,请参阅 this lua-l message。