12

我正在使用一个封闭源代码的应用程序,它加载 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?

谢谢,克里斯

4

5 回答 5

9

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

快速搜索“lua lint”会产生这两个工具:lua-checkerLua lint

但是,您可能希望推出自己的工具以满足您的特定需求。

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

请不要犹豫,在Metalua 邮件列表上发布您的问题。那里的人通常非常乐于助人。

于 2009-05-14T23:24:58.367 回答
4

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

于 2012-09-23T05:02:02.357 回答
2

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

于 2009-05-18T12:59:20.267 回答
1

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

通常范围规则很简单:

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

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

于 2009-05-14T23:04:30.943 回答
0

我刚开始使用luacheck,非常棒!

第一个版本是从 2015 年开始的。

于 2021-04-04T16:38:00.380 回答