lua 静态分析:检测未初始化的 table 字段

lua static analysis: detecting uninitialized table field

我正在使用 luacheck(在 Atom 编辑器中),但对其他静态分析工具开放。

有没有办法检查我是否使用了未初始化的 table 字段?我阅读了文档 (http://luacheck.readthedocs.io/en/stable/index.html),但也许我错过了如何执行此操作?

在下面代码的所有三种情况下,我都试图检测到我(错误地)使用了字段 'y1'。 None 其中有。 (在 运行 时间检测到它,但我试图在 运行 时间之前捕获它)。

local a = {}
a.x = 10
a.y = 20
print(a.x + a.y1)         -- no warning about uninitialized field y1 !?

-- luacheck: globals b
b = {}
b.x = 10
b.y = 20
print(b.x + b.y1)         -- no warning about uninitialized field y1 !?

-- No inline option for luacheck re: 'c', so plenty of complaints
-- about "non-standard global variable 'c'."
c = {}                    --   warning about setting
c.x = 10                  --   warning about mutating
c.y = 20                  --     "       "     "
print(c.x + c.y1)         --   more warnings (but NOT about field y1)

重点是:随着项目的增长(文件的增长,模块的数量和大小的增长),最好能防止像这样的简单错误悄悄出现。

谢谢。

lua-inspect should be able to detect and report these instances. I have it integrated into ZeroBrane Studio IDE and when running with the deep analysis 它报告此片段的以下内容:

unknown-field.lua:4: first use of unknown field 'y1' in 'a'
unknown-field.lua:7: first assignment to global variable 'b'
unknown-field.lua:10: first use of unknown field 'y1' in 'b'
unknown-field.lua:14: first assignment to global variable 'c'
unknown-field.lua:17: first use of unknown field 'y1' in 'c'

(请注意,集成代码仅报告这些错误的第一个实例,以尽量减少报告的实例数量;我还修复了一个仅报告字段的第一个未知实例的问题,因此您可能需要使用最新代码来自 repository.)

研究 "Lua static analysis" 相关问题的人也可能对 键入 Lua 的各种方言感兴趣,例如:

但你可能没有听说过“Teal”。 (早期它被称为 "tl"); .

我冒昧地使用蓝绿色回答我原来的问题,因为我觉得它很有趣。

-- 'record' (like a 'struct')
local Point = record
   x : number
   y : number
end

local a : Point = {}
a.x = 10
a.y = 20
print(a.x + a.y1)   -- will trigger an error
                    -- (in VS Code using teal extension & at command line)

从命令行:

> tl check myfile.tl
========================================
1 error:
myfile.tl:44:13: invalid key 'y1' in record 'a'

顺便说一句...

> tl gen myfile.tl'

创建一个纯 Lua 文件:'myfile.lua' 其中 没有类型 信息。注意:运行 这个 Lua 文件会触发 'nil' 错误... lua: myfile.lua:42: attempt to index a nil value (local 'a').

因此,Teal 让您有机会捕获 'type' 错误,但不需要您在生成 Lua 文件之前修复错误。