我正在使用luacheck(在Atom编辑器中),但对其他静态分析工具开放。
有没有办法检查我是否使用了未初始化的表字段?我阅读了文档(http://luacheck.readthedocs.io/en/stable/index.html),但也许我错过了如何做到这一点?
在以下代码中的所有三种情况中,我都试图检测到我(错误地)使用字段'y1'。他们都没有。 (在运行时它被检测到,但我试图在运行时捕获它。)
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)
重点在于:随着项目的增长(文件增长,模块的数量和大小增加),防止像这样的简单错误蔓延开来会很好。
感谢。
答案 0 :(得分:2)
lua-inspect应该能够检测并报告这些实例。我已将其集成到ZeroBrane Studio IDE中,当使用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。)
答案 1 :(得分:0)
研究与“ Lua静态分析”有关的问题的人们可能也对类型的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:尝试索引nil值(本地“ a”)。
因此,Teal为您提供了捕获“类型”错误的机会,但不需要您在生成Lua文件之前对其进行修复。