【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 ...
随机推荐
- 查看JVM中的线程名
实例说明 在Java虚拟机中(JVM):除了用户创建的线程,还有服务于用户线程的其他线程.它们根据不同的用途被分到不同的组中进行管理.本实例将演示JVM中线程的名字及其所在组的名称. 关键技术 线程组 ...
- cache之guava
本文主要记录guava_cache的学习心得! 缓存是什么?为何要用缓存呢? 先参考下图! 这是一张小白图!简单形容了一个普普通通的服务端请求的处理模型! 当一个request请求通过网络不远千里的来 ...
- 资源:CentOS下载地址资源
新版本系统镜像下载(当前最新是CentOS 7.4版本) CentOS官网 官网地址 http://isoredirect.centos.org/centos/7.4.1708/isos/x86_64 ...
- hfctfwp(re)
1.easy python revering 看字节码操作,昂哥直接看直接写exp太强了,我就直接手动写了个源码出来(昂哥永远滴神) arr0=[249,91,149,113,16,91,53,41, ...
- SoapUI Pro 最新版本和最新功能
专为整个后端的端到端测试而构建 创建全面的端到端测试,以从API定义或实时端点验证API的整个工作流程.只需单击几下即可传递响应数据并添加断言-无需编码. 综合生成或配置数据 通过简单的数据驱动测试来 ...
- MQTT介绍与使用(转载)
物联网是新一代信息技术的重要组成部分,也是"信息化"时代的重要发展阶段.其英文名称是:"Internet of things(IoT)".顾名思义,物联网就是物 ...
- Python单元测试框架unittest之批量用例管理(discover)
前言 我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢?这时候就需要用到unittet里面的discover方法来加载用例了.加载用例后,用unittest里面的TextT ...
- UI自动化测试框架Gauge 碰到无法识别Undefined Steps 红色波纹标记
如果碰到无法识别的情况,例如下面的红色波纹,可以试一下: 第一步: 第二步: 不勾选'offline work' 第三部:刷新之后可以重新编译.
- C语言:逻辑运算符||
#include <stdio.h> //逻辑运算符||特点:左右两边的表达式先做左边,如果左边为1则右边不用执行,整个结果为1:如果左边为0,再执行右边: main() { int x= ...
- 【Java数据结构与算法】简单排序、二分查找和异或运算
简单排序 选择排序 概念 首先,找到数组中最小的那个元素,其次,把它和数组的第一个元素交换位置(如果第一个元素就是最小的元素那么它就和自己交换).再次,在剩下的元素中找到最小的元素,将它与数组的第二个 ...