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

时间:2016-09-11 13:48:13

标签: lua static-analysis

我正在使用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)

重点在于:随着项目的增长(文件增长,模块的数量和大小增加),防止像这样的简单错误蔓延开来会很好。

感谢。

2 个答案:

答案 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文件之前对其进行修复。