静态分析Lua代码的潜在错误
我正在使用一个封闭源代码的应用程序来加载Lua脚本,并允许通过修改这些脚本进行一些定制。不幸的是,如果其中一个Lua脚本出现问题,该应用程序并不擅长生成有用的日志输出(我得到的只是“脚本失败”) <>我意识到动态语言对静态代码分析非常有抵抗力,例如C++代码可以被分析。 不过,我希望有一个工具可以运行Lua脚本,例如警告未在特定脚本上下文中定义的变量 基本上,我要寻找的是一个用于脚本的工具:静态分析Lua代码的潜在错误,lua,code-analysis,static-analysis,Lua,Code Analysis,Static Analysis,我正在使用一个封闭源代码的应用程序来加载Lua脚本,并允许通过修改这些脚本进行一些定制。不幸的是,如果其中一个Lua脚本出现问题,该应用程序并不擅长生成有用的日志输出(我得到的只是“脚本失败”) 我意识到动态语言对静态代码分析非常有抵抗力,例如C++代码可以被分析。 不过,我希望有一个工具可以运行Lua脚本,例如警告未在特定脚本上下文中定义的变量 基本上,我要寻找的是一个用于脚本的工具: local a print b 将输出: warning: script.lua(1): local 'a
local a
print b
将输出:
warning: script.lua(1): local 'a' is not used'
warning: script.lua(2): 'b' may not be defined'
它只能真正成为大多数事情的警告,但这仍然是有用的!有这样的工具吗?或者可能是一个LuaIDE,它内置了这样的功能
谢谢,Chris您需要为lua找到一个解析器(应该是开源的),并使用它将脚本解析成一个合适的AST树。使用该树和一个简单的变量可见性跟踪器来找出何时定义或未定义变量 通常范围界定规则很简单:
- 从顶部AST节点和空范围开始
- 项目查看该节点的子语句。每个变量声明都应添加到当前范围中李>
- 如果新范围正在启动(例如通过{运算符),请创建一个新的变量范围(继承当前范围中的变量)
- 当作用域结束时(例如通过}),删除当前子变量作用域并返回父变量
- 仔细迭代李>
这将为您提供哪些变量在AST中可见。您可以使用这些信息,如果您还检查AST节点的表达式(变量的读/写),您可以找到您的信息。Lua的自动静态代码分析通常不是一项简单的任务。然而,对于一组有限的实际问题,它是完全可行的 Quick提供以下两种工具:和 但是,您可能希望根据自己的具体需要使用自己的工具 是静态Lua代码分析最强大的工具之一。例如,请参阅全局变量使用分析工具 请毫不犹豫地将您的问题发布到。那里的人通常很有帮助。要查看全局列表,请参阅。检查本地人更难。也有,它基于前面提到的metalua。我已经将其集成到中,它生成的输出与您期望的非常相似。请参阅此答案以了解详细信息:。我刚刚开始使用,它非常棒
第一个版本是2015年发布的。您可能指的不是“{”和“}”(在Lua中用作表构造函数),而是“do”和“end”关键字(还有各种控制结构,如if-then-else、两种for循环等)。我不知道Lua语言看起来是什么样子:-),但我假设它有一些“变量范围”的概念。实际上,我最近为Java做了这种事情。