Lua Lint

lua-users home
wiki

lualint 使用 luac 进行基于字节码的静态分析,检查 Lua 源代码中全局变量的使用情况。

来源: http://place.org/~nop/lualint-0.0.tar.gz (本地: Files:wiki_insecure/users/nop/lualint) (github: https://github.com/philips/lualint)

用法: lualint [-r|-s] filename.lua [ [-r|-s] [filename.lua] ...]

描述

lualint 使用 luac 的字节码列表。它会报告对所有未声明的全局变量的访问,从而捕获许多变量名中的类型错误。例如

local really_aborting
local function abort() os.exit(1) end
if not os.getenv("HOME") then
  realy_aborting = true
  abortt()
end

报告

/tmp/example.lua:4: *** global SET of realy_aborting
/tmp/example.lua:5: global get of abortt

它主要用于 LTN7 样式的模块,其中每个源文件只导出一个全局符号。(包含在文件 "foobar.lua" 中的模块应该只导出符号 "foobar"。)

对于非 LTN7 样式的源代码,提供了一种“宽松”模式。它只检测从未设置的全局变量的读取操作。开关 "-r" 将 lualint 切换到宽松模式,用于后续文件;"-s" 切换回严格模式。

必需的包会被跟踪,但不会递归跟踪。如果您调用 "myext.process()",您应该需要 "myext",而不是依赖其他依赖项来加载它。LUA_PATH 会像往常一样被用于查找需求。

一些(并非严格意义上的 LTN7)模块可能希望将其他变量导出到全局环境中。为此,请使用 declare 函数

declare "xpairs"
function xpairs(node)
  [...]

类似地,要消除对可能不可用的全局变量读取的警告

lint_ignore "lua_fltk_version"
if lua_fltk_version then print("fltk loaded") end

定义这些的一种方法是在模块 "declare.lua" 中

function declare(s)
end
declare "lint_ignore"
function lint_ignore(s)
end

(设置 declare 是可以的,因为它在 "declare" 模块中。)这些函数不需要做任何事情,实际上也不需要存在!它们可以存在于死代码中

if false then declare "xpairs" end

这是因为 lualint 只对字节码进行相当原始和粗略的扫描。也许声明应该只允许在主块中。

待办事项

错误不会以任何特定顺序出现。

应该切换到 RiciLake 的解析器,它应该在这方面做得更好,并允许检测一些其他常见情况。

致谢

JayCarlson ([email protected])

这一切都是 Ben Jackson ([email protected]) 的错,他在 MOO 中做了一些类似的技巧。

许可证

MIT 许可证。
最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2012 年 4 月 25 日凌晨 2:28 GMT (差异)