有没有可能在不执行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,然后执行。我想知道当我加载它的时候,它是否包含错误,而不是当我执行它的时候。这个是可能的吗?
发布于 2011-03-10 04:48:52
(这原本是对Krtek问题的第一个评论的回复,但我的空间已经用完了,老实说,这是一个很好的答案。)
函数本质上是值,因此命名函数实际上是该名称的变量。变量,根据它们的定义,可以随着脚本的执行而改变。见鬼,可能会有人意外地重新定义其中的一个函数。这是不是很糟糕?总结一下我的想法:根据脚本、传递的参数和/或你所说的那些预定义函数的实际实现(例如,一个人可能取消自身或其他人的设置),除非你愿意缩小一些要求的范围,否则不可能保证事情的正常进行。Lua对于你正在寻找的东西来说太动态了。:)
如果你想要一个完美的测试:创建一个虚拟环境,把所有的功能都放在适当的地方,看看它是否会在测试过程中的任何地方崩溃(加载、执行等)。这基本上是一种单元测试,因此会相当繁重。
如果你想要一个基本检查,看看一个脚本是否有一个有效的语法:Krtek已经给出了答案。我非常确定(但不是100%) lua的等价物是loadfile或loadstring,而相应的C等价物是尝试和lua_load()代码,其中每一个都将可读脚本转换为字节码,这是您在正常的通用用例中实际执行代码之前已经需要做的事情。(如果其中包含函数定义,则需要稍后执行这些定义,以便执行这些定义中的代码。)
然而,在实际发生错误之前,这些是您可以选择的范围。Lua是一种非常动态的语言,当你想要证明正确性时,什么是一个强大的优势也会导致一个弱点。对于一个完美的解决方案来说,涉及的变量太多了。
发布于 2011-03-10 01:35:50
您可以使用LUA Compiler。它只会将你的文件编译成字节码,而不会执行它。
如果你的程序被编译了,它的运行速度也会更快.
根据链接的手册页,您甚至可以使用-p选项仅执行语法检查:
-p加载文件,但不生成任何输出文件。主要用于语法检查或测试预编译块:损坏的文件在加载时可能会生成错误。要进行粗略的完整性测试,请使用-t。
发布于 2011-03-18 09:51:34
一般来说,这是不可能的,因为Lua是一种动态语言,而且大多数错误都发生在运行时。
如果要检查语法错误,请使用luac -p选项。例如,我将其用作预提交钩子的一部分。
其他常见的错误是由滥用全局变量触发的。您可以分析luac -l的输出来捕获这些情况。请看这里:http://lua-users.org/wiki/DetectingUndefinedVariables。
如果您想要更高级的东西,有几个或多或少功能强大的Lua代码静态分析工具。从LuaInspect开始。
在任何情况下,建议您编写单元测试,而不是仅仅依赖静态代码检查。少一点痛苦,多一点收获。
https://stackoverflow.com/questions/5249709
复制相似问题