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 文件之前修复错误。
我正在使用 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 文件之前修复错误。