静态分析Lua代码以查找潜在错误

时间:2009-05-14 22:48:37

标签: lua code-analysis static-analysis

我正在使用一个加载Lua脚本的闭源应用程序,并允许通过修改这些脚本进行一些自定义。不幸的是,如果其中一个Lua脚本出现问题,应用程序不能很好地生成有用的日志输出(我得到的全部是'脚本失败')。

我意识到动态语言几乎可以抵抗静态代码分析,例如C ++代码的分析方式。

我希望,有一个工具可以通过Lua脚本运行,例如警告未在特定脚本的上下文中定义的变量。

基本上我正在寻找的是一个用于脚本的工具:

local a
print b

会输出:

warning: script.lua(1): local 'a' is not used'
warning: script.lua(2): 'b' may not be defined'

对于大多数事情来说它只能是警告,但这仍然有用!这样的工具存在吗?或者是一个具有内置功能的Lua IDE?

谢谢,克里斯

5 个答案:

答案 0 :(得分:9)

Lua的自动静态代码分析通常不是一件容易的事。但是,对于一组有限的实际问题,这是非常可行的。

快速googling for "lua lint"会产生以下两个工具:lua-checkerLua lint

您可能希望根据自己的特定需求推出自己的工具。

Metalua是静态Lua代码分析最强大的工具之一。例如,请参阅metalint,这是全局变量使用分析的工具。

请不要犹豫,在Metalua mailing list上发布您的问题。那里的人通常非常有帮助。

答案 1 :(得分:3)

还有lua-inspect,它基于已经提到的metalua。我已将其集成到ZeroBrane Studio IDE中,这会产生与您期望的非常相似的输出。有关详细信息,请参阅此SO答案:https://stackoverflow.com/a/11789348/1442917

答案 2 :(得分:2)

要检查全局变量,请参阅this lua-l posting。检查当地人更难。

答案 3 :(得分:1)

您需要找到lua的解析器(应该作为开源提供)并使用它将脚本解析为适当的AST树。使用该树和一个简单的可变可见性跟踪器来查找变量何时定义或未定义。

通常,范围规则很简单:

  • 从顶级AST节点和空范围开始
  • 项目查看该节点的子语句。应在当前范围中添加每个变量声明。
  • 如果新范围正在启动(例如通过{运算符),则创建一个继承当前范围中的变量的新变量范围。
  • 当范围结束时(例如,通过})删除当前子变量范围并返回父级。
  • 仔细考虑。

这将为您提供AST内部可见的变量。您可以使用此信息,如果您还检查表达式AST节点(读/写变量),您可以找到您的信息。

答案 4 :(得分:0)

我刚开始使用 luacheck,它非常好!

第一个版本是 2015 年。