lua脚本错误检查

时间:2011-03-09 17:28:30

标签: lua

是否可以检查lua脚本是否包含错误而不执行它?我已经停止了代码:


    if(luaL_loadbuffer(L, data, size, name))
    {
        fprintf (stderr, "%s", lua_tostring (L, -1));
        lua_pop (L, 1);
    }

    if(lua_pcall(L, 0, 0, 0))
    {
        fprintf (stderr, "%s", lua_tostring (L, -1));
        lua_pop (L, 1);
    }

但是如果脚本包含错误,它会先执行并执行。我想知道它在加载时是否包含错误,而不是在我执行它时。这可能吗?

3 个答案:

答案 0 :(得分:6)

您可以使用LUA Compiler。它只会将您的文件编译为字节码而不执行它。

如果编译它,你的程序也会有更快的运行速度。

根据链接的手册页,您甚至可以使用-p选项仅执行语法检查:

  

-p加载文件但不生成任何输出文件。主要用于语法检查或测试预编译块:损坏的文件可能在加载时生成错误。对于thourough完整性测试,请使用-t。

答案 1 :(得分:6)

(这最初的意思是对Krtek问题的第一个评论的回复,但我在那里用完了空间,说实话,它的答案很好。)

函数本质上是值,因此命名函数实际上是该名称的变量。根据它们的定义,变量可以在脚本执行时改变。地狱,有人可能会意外地重新定义其中一个功能。那不好吗?总结一下我的想法:取决于脚本,传递的参数和/或你所说的那些预定义函数的实际实现(例如,一个可能会使自己或其他人未设置),除非你是愿意缩小你的一些要求。 Lua对于你正在寻找的东西来说太过动态了。 :)

如果你想要一个完美无瑕的测试:创建一个虚拟环境,其中包含所有铃声和口哨,并查看它是否在途中崩溃(加载,执行等)。这基本上是一种单元测试,因此非常重。

如果您想要基本检查以查看脚本是否具有有效语法:Krtek已经为此提供了答案。我非常肯定(但不是100%)lua等价于loadfileloadstring,并且相应的C等价物是尝试lua_load()代码,每个代码转换为可读脚本到字节码,你可能需要做的事情才能真正执行普通的all-well-well用例中的代码。 (如果它包含函数定义,则需要稍后执行这些函数定义以执行那些内部的代码。)

但是,这些是您在实际发生之前预先排除错误的选择范围。 Lua是一种非常有活力的语言,当你想要证明正确性时,强大的力量也会导致弱点。完美的解决方案涉及太多变量。

答案 2 :(得分:4)

一般来说,这是不可能的,因为Lua是一种动态语言,并且大多数错误都发生在运行时。

如果要检查语法错误,请使用luac -p选项。例如,我将它用作预提交钩子的一部分。

其他常见错误是通过滥用全局变量触发的。您可以分析luac -l的输出以捕获这些情况。见这里:http://lua-users.org/wiki/DetectingUndefinedVariables

如果您想要更高级的东西,可以使用几种或多或少的功能静态分析工具来实现Lua代码。从LuaInspect开始。

在任何情况下,建议您编写单元测试而不是仅依靠静态代码检查。减轻痛苦,增加收益。