lua脚本错误检查

Mir*_*pas 9 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

krt*_*tek 6

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

如果编译,您的程序也将具有运行速度更快的优势.

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

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


Sti*_*gma 6

(这最初是作为对Krtek问题的第一条评论的回复,但我在那里用尽了空间,说实话,它可以作为答案.)

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

如果你想要一个完美的测试:创建一个虚拟的环境,所有的铃声和​​口哨都在适当的位置,看看它是否在路上的任何地方崩溃(加载,执行等).这基本上是一种单元测试,因此非常重.

如果你想要一个基本的检查,看看脚本是否有一个有效的语法:Krtek已经给出了答案.我非常肯定(但不是100%)lua等价物是loadfile或者loadstring,并且相应的C等价物是尝试和lua_load()代码,每个代码都将可读脚本转换为字节码,在实际执行之前你需要做正常的all-well-well用例中的代码.(如果它包含函数定义,那么稍后需要执行这些函数定义以执行那些内部的代码.)

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


Ale*_*ysh 5

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

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

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

如果你想要更高级的东西,有几个或多或少的 Lua 代码功能静态分析工具。从LuaInspect开始。

在任何情况下,建议您编写单元测试而不是仅仅依赖静态代码检查。更少的痛苦,更多的收获。