在lua中是否可能确定函数的返回值?或者一个函数是否返回任何东西?

假设我制作了一个函数,其目的是分析供参数使用的另一个函数并返回该指定函数是否会返回任何值,如果会,则返回哪个值。

local function CheckFunctionReturn(func)
  --返回func是否会返回任何内容。
end
local function myFunc()
  return 123;
end
CheckFunctionReturn(myFunc);

我陷入了困境。也许调试库中有一个可以帮助的函数?我将感激任何帮助。

点赞
用户5287638
用户5287638

没有调试库中的函数可以做到这一点。相反,您需要分析源代码或字节码以找到程序将会执行什么操作。 Lua Wiki 上有一些可用的资源,其他人上面也提出了一些很好的建议。

请注意,当给定任意输入时,一个任意函数是否会返回,这是 停机问题,而艾伦·图灵早在1936年就证明了在一般情况下无法解决它。然而,对于简单的函数和/或输入,它是可解的,所以如果您的特定情况足够简单,您也许可以做到。

2017-05-10 23:47:07
用户1847592
用户1847592

这是一个快速且不太完善的解决方案(只适用于 Lua 5.1 和 LE 架构),在大多数情况下可能有效,但并非总是有效的。

它只回答问题“这个函数是否会返回一些值?”

local function CheckFunctionReturn(func)
   -- 如果 func 会返回任何内容,返回 true

   local d = string.dump(func)
   assert(d:sub(1,5) == "\27LuaQ") -- 只适用于 Lua 5.1

   -- 查找第一个 "return"(0x0080001E)之前的代码
   d = d:match"^.-\30%z\128%z"

   -- 查找带有非零返回值的 "return"
   for pos = #d % 4 + 1, #d, 4 do
      local b1, b2, b3, b4 = d:byte(pos, pos+3)
      local dword = b1 + 256 * (b2 + 256 * (b3 + 256 * b4))
      local OpCode, BC = dword % 64, math.floor(dword/16384)
      local B, C = math.floor(BC/512), BC % 512
      if OpCode == 30 and C == 0 and B ~= 1 then
         return true
      end
   end
   return false
end

print(CheckFunctionReturn(aFunctionToBeAnalyzed));
2017-05-10 23:47:24
用户4262157
用户4262157
## Am I missing something?
我有什么地方遗漏了吗?

local function CheckFunctionReturn(func)
    print(type(func()))
end

local function myFunc()
    return 123;
end

CheckFunctionReturn(myFunc);
2017-05-11 01:16:36
用户851350
用户851350

Lua 内置的 debug API 文档说:

返回钩子:在解释器从函数返回时调用。该钩子在 Lua 离开函数之前被调用。没有标准的方式来访问函数返回的值。

2017-05-12 02:58:40