静态分析Lua代码的潜在的错误。
-
21-08-2019 - |
题
我使用封闭源代码的应用程序载Lua脚本和允许一些定制通过修改这些脚本。不幸的是,程序不是非常好的产生有用的记录输出(我得到的是'script失败')如果出现错误的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样的功能,建立在?
谢谢,克里斯
解决方案
自动静码分析Lua不是一项容易的任务。然而,对于一套有限的实际问题,这是相当可行的。
快速 谷歌上搜索为"lua棉绒" 产生这两种工具: lua检查 和 Lua林特.
你可能想要滚你自己的工具,满足特定需求。
Metalua 是一个最强大的工具,为静态Lua码分析。例如,请看看 metalint, ,该工具为全球变量使用情况的分析。
请不要犹豫后你的问题 Metalua的邮件列表.人们通常有很大的帮助。
其他提示
还有 LUA-检查,该是基于已经提到metalua。我已经将它纳入 ZeroBrane Studio IDE中,生成输出非常相似,你会期待什么。看到该SO回答细节: https://stackoverflow.com/a/11789348/1442917
有关检查全局变量,看此LUA -1-张贴。检查当地人更难。
您需要找到 lua 的解析器(应该作为开源提供)并使用它将脚本解析为正确的 AST 树。使用该树和一个简单的变量可见性跟踪器来查找变量何时定义或未定义。
通常范围规则很简单:
- 从顶部 AST 节点和空范围开始
- item 查看该节点的子语句。每个变量声明都应该添加到当前作用域中。
- 如果一个新的作用域正在启动(例如通过 { 运算符),则创建一个新的变量作用域,继承当前作用域中的变量)。
- 当作用域结束时(例如通过 } )删除当前子变量作用域并返回到父变量。
- 仔细迭代。
这将为您提供哪些变量在 AST 内可见。您可以使用此信息,如果您还检查表达式 AST 节点(变量的读/写),您可以找到您的信息。