Lua 静态分析:检测未初始化的table字段
2016-9-11 13:48:13
收藏:0
阅读:91
评论:2
我正在使用 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的警告)
重点是:随着项目的增长(文件的增长以及模块的数量和大小的增长),防止此类简单错误的发生是很好的。
谢谢。
点赞
用户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
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

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