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

我正在使用 luacheck(在 Atom 编辑器中),但也希望了解其他静态分析工具。

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

在下面的代码的三个案例中,我都试图检测我是否(错误地)使用了字段“y1”。但是它们都没有。 (在运行时会检测到,但我正在尝试在运行时之前捕获它。)

local a = {}
a.x = 10
a.y = 20
print(a.x + a.y1)       -- 没有关于未初始化字段y1的警告!?

-- luacheck:global b
b = {}
b.x = 10
b.y = 20
print(b.x + b.y1)       -- 没有关于未初始化字段y1的警告!?

-- 没有关于“c”的内联选项,因此会有很多投诉
--关于“非标准全局变量'c'”。
c = {}                  -- 关于设置的警告
c.x = 10                -- 关于变异的警告
c.y = 20                -- “ ” ” ” “
print(c.x + c.y1)       -- 更多警告(但不包括有关字段y1的警告)

重点是:随着项目的增长(文件的增长以及模块的数量和大小的增长),防止此类简单错误的发生是很好的。

谢谢。

点赞
用户1442917
用户1442917

lua-inspect 应该能够检测和报告这些情况。我已经将其集成到 ZeroBrane Studio IDE 中,在运行时使用 深度分析 ,它就会报告这个代码片段中的以下内容:

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'

(请注意,集成代码仅报告这些错误的第一次出现,以最小化报告实例的数量;我还修复了只报告第一个未知字段实例的问题,因此您可能希望使用存储库 中的最新代码。)

2016-09-11 16:34:47
用户2242940
用户2242940

研究“Lua静态分析”问题的人可能也对各种不同方言的Typed Lua感兴趣,例如:

但是你可能没有听说过“Teal”。(在其发展初期,它被称为“tl”)。

我要利用Teal来回答我的原始问题,因为我觉得它很有趣。

-- '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为您提供了捕获“类型”错误的机会,但它不要求您在生成Lua文件之前修复它们。

2020-04-11 19:26:56