Lua Lint

lua-users home
wiki

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

源代码: http://place.org/~nop/lualint-0.0.tar.gz (本地: 文件: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()",你应该 require "myext",而不是依赖其他依赖项来加载它。LUA_PATH 照常用于查找 require。

一些 (不严格是 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 的解析器,它应该能更好地完成这项工作,并允许检测一些其他常见情况。

致谢

Jay Carlson (nop@nop.com)

这都是 Ben Jackson (ben@ben.com) 的错,他在 MOO 中做了一些类似的事情。

许可

MIT 许可。
RecentChanges · preferences
编辑 · 历史
最后编辑于 2012 年 4 月 24 日下午 8:28 GMT (差异)