【Lua篇】静态代码扫描分析(一)初步介绍
一、静态代码分析
静态代码分析是一种通过检查代码而不是执行程序来发现源代码中错误的手段。通常可以帮助我们发现常见的编码错误,例如:
语法错误
违反制定的标准编码
未定义的变量
安全性问题
静态代码分析可以通过评估编写的代码来提高代码质量;可以稳定的运行且可以轻松自动化;增加了在源代码中发现漏洞的可能性,从而提高应用安全;由于是针对源码扫描可以在离线的开发环境中完成。但是静态代码分析并不能完全保证编写的代码没有Bug,它也有一些缺点,例如:
误报问题,发现了一个不是错误的错误。
静态分析的规则需要特定维护,并非总是适用。
系统和第三方库可能无法分析。
二、为何需对Lua代码进行静态分析
Lua脚本语言在性能方面非常出色、语法简单且容易上手。目前有相当多的游戏服务器和客户端程序都是使用它来开发功能业务。Lua属于解释性语言,编写的逻辑代码只有在程序运行的过程才会发现逻辑错误,而一些较隐藏的分支可能要经过很长时间的运行才能触发错误。未发现的错误如果在正式环境中触发将会产生不可预估的损失。
如何发现更多的错误,除了通过更加详细的测试外,还可以利用工具来弥补,下面列举了一些平时常见的错误问题,如果使用静态扫描分析工具是很容易发现的。
1. 变量的作用域问题[1],定义的变量在超出了作用域外使用。
1 function demo(param)
2 if param then
3 local var = param.smobj:get_var()
4 -- do_something()
5 end
6 -- 声明的`var`变量在超出作用域后访问
7 local new_var = var + 3
8 end
2. 变量的作用域问题[2],超出作用域变量作为条件判断
1 function demo(param)
2 if param then
3 local var = param.smobj:get_var()
4 -- do_something()
5 end
6 if var then
7 -- 永远无法执行到,但不会报错
8 local new_var = var + 10
9 -- do_something()
10 end
11 end
3. 参数未定义,经常出现在代码复制-粘贴的时候,未修改完全
1 function Player:set_world_pos(x, y)
2 do_something(x,y)
3 if condition_false then
4 log("set_world_pos x:%s, y:%s", x, y)
5 end
6 end
7 function Player:set_pos(cx, cy)
8 do_something(cx, cy)
9 if condition_false then
10 -- 这里是从上面拷贝,但是传参没有修改
11 -- 代码不会报错但行为已经错了。
12 log("set_pos x:%s , y:%s", x, y)
13 end
14 end
4. 变量拼写错误,很常见但不易察觉。
1 -- 由于拼写错误,这个只有在重载文件或者热更文件出现
2 -- 出现就会导致数据丢失,所谓一个粗心导致的大错
3 g_player_mng = g_plater_mng or {}
4 -- do_something
5. 判空逻辑问题[1],先使用变量,后进行空值判断
1 function demo()
2 local var = self:get_value()
3 local count = #var
4 -- 先拿变量进行了操作,然后才判断空值情况
5 if var then
6 self:do_something()
7 end
8 end
6. 判空逻辑问题[2],判空的覆盖不全,后面继续使用了空值变量。
1 function demo()
2 local var = self:get_value()
3 if var then
4 count = #var
5 end
6 local r, b = self:get_data()
7 if b then
8 -- 虽然前面对var判空了
9 -- 但是没有进行处理,这里就继续使用了。
10 table.insert(var, r)
11 end
12 end
7. 类成员方法声明写错,“.”、“:” 经常写错。
1 -- 写类的成员方法的时候漏写了self 或者 :写成了.
2 function Player.set_hp(var)
3 if self.mHp > var then
4 self.mHp = var
5 end
6 end
8. 方法调用时,“.”、“:” 写错。
1 function Player:demo2(param)
2 -- 少传了参数self
3 self.demo()
4 -- 多传入了参数self.dos
5 self.dos:demoe(self.dos)
6 end
上面这些错误来自平时项目中血与泪的教训,如果能够通过静态代码扫描工具提前发现这些错误,那对提高代码的质量是非常有帮助和有价值的事情。目前市面上可以使用腾讯的TscanCode来对代码扫描,支持的语言也挺多的。
我也尝试花几篇文章来介绍一下如何编写一个简单的Lua代码扫描工具,主要介绍大体编写代码的逻辑流程。
文章来自我的公众号,大家如果有兴趣可以关注,具体扫描关注下图。

【Lua篇】静态代码扫描分析(一)初步介绍的更多相关文章
- 【Lua篇】静态代码扫描分析(四)规则检查
一.前言 通过前面三篇文章已经初步实现了将Lua源代码文件读取解析成语法树,现在就可以通过得到的语法树进行指定规则的代码扫描检查.下图简单列举了一下单个Lua文件内部的语法关系情况(注意并非真正的类图 ...
- 【Lua篇】静态代码扫描分析(三)语法分析
一.语法分析 通过将词法分析获取的Token流按照目标语言的语法进行解析的过程,例如解析函数声明.函数调用.变量声明.各种语句等. 二.Lua语法分析 在写语法分析程序前,先需要了解Lua的语句和语法 ...
- 【Lua篇】静态代码扫描分析(二)词法分析
一.词法分析 词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程.进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer, ...
- 静态代码扫描工具PMD定制xml的规则(一)操作篇
0.前言 PMD作为开源的静态代码扫描工具有很强的扩展能力,可使用java或xpath定制rule.第一篇从操作上讲解如何定制一个用于扫描xml是否规范的规则.首先我们知道xml格式的文件在java工 ...
- DEVOPS技术实践_05:sonar静态代码扫描
一.SonarQube静态代码扫描平台 1.1 安装 https://www.sonarqube.org/官网 1.2 下载软件包 https://www.sonarqube.org/download ...
- 使用OClint进行iOS项目的静态代码扫描
使用OClint进行iOS项目的静态代码扫描 原文链接:http://blog.yourtion.com/static-code-analysis-ios-using-oclint.html 最近需要 ...
- Lint——Android SDK提供的静态代码扫描工具
Lint和FindBugs一样,都是静态代码扫描工具,区别在于它是Android SDK提供的,会检查Android项目源文件的正确性.安全性.性能.可用性等潜在的bug并优化改进. 下图简单地描述了 ...
- Objective C静态代码扫描和代码质量管理 OClint + SonarQube
OClint是针对C, C++及Objective C代码的静态扫描分析工具,而SonarQube是一个开源的代码质量管理平台.本文将实现将OClint的扫描结果导入到SonarQube中,已实现对O ...
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...
随机推荐
- CentOS8安装GNOME3桌面并设置开机启动图形界面
本篇文章介绍如何在CentOS8 Linux操作系统中安装GNOME3桌面环境和GDM(GNOME Display Manager)现实环境管理器. 环境 CentOS8 Minimal 安装GNOM ...
- 11、gitlab和Jenkins整合(1)
1.在jenkins上安装git: 因为jenkins需要在gitlab上拉取代码: 具体的git安装,参考"4.git和gitlab的配置--4.2.git编译安装:": 2.在 ...
- gRPC(3):拦截器
在 gRPC 调用过程中,我们可以拦截 RPC 的执行,在 RPC 服务执行前或执行后运行一些自定义逻辑,这在某些场景下很有用,例如身份验证.日志等,我们可以在 RPC 服务执行前检查调用方的身份信息 ...
- 如何使用原生的Feign
什么是Feign Feign 是由 Netflix 团队开发的一款基于 Java 实现的 HTTP client,借鉴了 Retrofi. JAXRS-2.0.WebSocket 等类库.通过 Fei ...
- final修饰符(3)-基本类型变量和引用类型变量的区别
final修饰基本类型变量 当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变 final修饰引用类型变量 当使用final修饰引用类型变量时,它保存的仅仅是一 ...
- 添加Lombok插件后调用Setter或Getter方法IDEA编译错误
虽然添加Lombok插件,但是调用Setter或Getter方法IDEA编译错误,主要原因如下 解决办法:
- Spring Boot邮箱链接注册验证
Spring Boot邮箱链接注册验证 简单介绍 注册流程 [1]前端提交注册信息 [2]后端接受数据 [3]后端生成一个UUID做为token,将token作为redis的key值,用户数据作为re ...
- 以太坊-Win环境下remix环境搭建
一.node.js环境搭建 有多个安装方法,但是注意npm与node版本相关性较强!以下方案较为简便 1.下载网址 http://nodejs.cn/download/ 2.下载window 64位 ...
- node fs-extra文件操作模块的使用(支持同步、异步)
用法参见:fs-extra
- bs4爬取笔趣阁小说
参考链接:https://www.cnblogs.com/wt714/p/11963497.html 模块:requests,bs4,queue,sys,time 步骤:给出URL--> 访问U ...