【问题标题】:lua script error checkinglua脚本错误检查
【发布时间】:2011-07-12 02:32:04
【问题描述】:

是否可以在不执行的情况下检查 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);
    }

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

【问题讨论】:

  • 我们不能对评论投反对票,但如果你在谷歌上搜索“Lua lint”,你可能会改变主意

标签: lua


【解决方案1】:

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

如果您的程序经过编译,它还具有运行速度更快的优势。

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

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

【讨论】:

  • 我无法使用它,因为我已经从我的应用程序中注册了函数,而编译器对这些函数一无所知。我对只进行语法检查不感兴趣,我还想知道是否有人调用了未注册的函数(可能是一些拼写问题)。
  • 噢。路亚4.0?当前版本是 5.1
  • @Alexender 所以仅仅因为我链接到一个旧的手动条目我得到了反对?顺便说一句,这是 Google 上“lua 编译器”的第一个结果,抱歉我没有检查地址栏;)
【解决方案2】:

(这原本是作为对 Krtek 问题的第一条评论的回复,但我的空间不足,老实说,它可以作为一个很好的答案。)

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

如果您想要一个完美的测试:创建一个所有花里胡哨的虚拟环境,并查看它是否在沿途的任何地方崩溃(加载、执行等)。这基本上是一种单元测试,因此会非常繁重。

如果您想要基本检查以查看脚本是否具有有效语法:Krtek 已经给出了答案。我很确定(但不是 100%)lua 等效于 loadfileloadstring,而相应的 C 等效项是尝试和 lua_load() 代码,每个代码都将可读脚本转换为字节码,你会在您可以在正常的“万事如意”用例中实际执行代码之前,您已经需要这样做了。 (如果其中包含函数定义,则需要稍后执行这些函数定义才能执行其中的代码。)

但是,这些是您在错误实际发生之前预防错误的选择范围。 Lua 是一种非常动态的语言,当你想证明正确性时,强大的力量也会成为弱点。一个完美的解决方案涉及的变量太多了。

【讨论】:

  • 我想检查这个,因为我会有很多脚本,其中一些只在难以测试的特殊条件下执行。我将为我的 C++ 函数使用存根函数对所有脚本进行单元测试,以确保它们存在,同时也避免执行它们。感谢您的回答!
  • 很高兴我能帮上忙。 :) 您很可能创建一种GenerateStub(param1type, param2type, ...) 函数,该函数创建并返回一个函数,如果一个或多个参数的类型不正确,该函数会引发错误。这样,您可以检查多个函数是否存在:您可以检查提供的参数是否具有正确的类型,并存在错误错误的风险。示例:如果一个真正的函数应该用数字填充一个表,当另一个将一个值从它传递给一个存根函数时,您的测试运行将传递 nil(而不是一个数字!),然后导致存根错误地出错。跨度>
【解决方案3】:

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

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

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

如果您想要更高级的东西,有几个或多或少的功能性静态分析工具用于 Lua 代码。以LuaInspect开头。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    相关资源
    最近更新 更多