gpt4 book ai didi

LuaJIT setfenv 似乎没有设置对给定环境的进一步函数调用

转载 作者:行者123 更新时间:2023-12-04 14:21:16 25 4
gpt4 key购买 nike

我正在尝试使用 setfenv 对一些函数进行沙盒处理,我收到以下输出:

123
nil

为什么调用sandboxTest()testValuenil,而在callSandboxedTest()中访问时是123 >?

使用 LuaJIT 2.1.0-beta2 (Lua 5.1)

function sandboxTest()
print(testValue)
end

local aNumber = 123

function callSandboxedTest()
setfenv(1, {
print = print,
testValue = aNumber,
sandboxTest = sandboxTest
})
print(testValue)
sandboxTest()
end

callSandboxedTest()

最佳答案

环境不是调用堆栈的一部分。每个函数都有其自己的 环境。所以 sandboxTestcallSandboxTest 都有一个环境。更改一个函数的环境不会影响另一个函数的环境。

sandboxTest 将继续使用默认环境,因此它将访问常规全局表以查找 testValue。由于 testValue 从未在全局表中设置,因此 sandboxTest 将得到 nil

这就是为什么在维护沙箱时,仔细选择向沙箱公开哪些功能非常重要。如果某个函数需要成为沙箱的一部分,则该函数需要设置其环境。

这就是为什么最好基于已编译的 Lua block 而不是单个函数进行沙箱化。创建函数时,创建的函数会继承当前环境。

关于LuaJIT setfenv 似乎没有设置对给定环境的进一步函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41404979/

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