一、静态代码分析

        静态代码分析是一种通过检查代码而不是执行程序来发现源代码中错误的手段。通常可以帮助我们发现常见的编码错误,例如:

  • 语法错误

  • 违反制定的标准编码

  • 未定义的变量

  • 安全性问题

静态代码分析可以通过评估编写的代码来提高代码质量;可以稳定的运行且可以轻松自动化;增加了在源代码中发现漏洞的可能性,从而提高应用安全;由于是针对源码扫描可以在离线的开发环境中完成。但是静态代码分析并不能完全保证编写的代码没有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篇】静态代码扫描分析(一)初步介绍的更多相关文章

  1. 【Lua篇】静态代码扫描分析(四)规则检查

    一.前言 通过前面三篇文章已经初步实现了将Lua源代码文件读取解析成语法树,现在就可以通过得到的语法树进行指定规则的代码扫描检查.下图简单列举了一下单个Lua文件内部的语法关系情况(注意并非真正的类图 ...

  2. 【Lua篇】静态代码扫描分析(三)语法分析

    一.语法分析 通过将词法分析获取的Token流按照目标语言的语法进行解析的过程,例如解析函数声明.函数调用.变量声明.各种语句等. 二.Lua语法分析 在写语法分析程序前,先需要了解Lua的语句和语法 ...

  3. 【Lua篇】静态代码扫描分析(二)词法分析

    一.词法分析 词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程.进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer, ...

  4. 静态代码扫描工具PMD定制xml的规则(一)操作篇

    0.前言 PMD作为开源的静态代码扫描工具有很强的扩展能力,可使用java或xpath定制rule.第一篇从操作上讲解如何定制一个用于扫描xml是否规范的规则.首先我们知道xml格式的文件在java工 ...

  5. DEVOPS技术实践_05:sonar静态代码扫描

    一.SonarQube静态代码扫描平台 1.1 安装 https://www.sonarqube.org/官网 1.2 下载软件包 https://www.sonarqube.org/download ...

  6. 使用OClint进行iOS项目的静态代码扫描

    使用OClint进行iOS项目的静态代码扫描 原文链接:http://blog.yourtion.com/static-code-analysis-ios-using-oclint.html 最近需要 ...

  7. Lint——Android SDK提供的静态代码扫描工具

    Lint和FindBugs一样,都是静态代码扫描工具,区别在于它是Android SDK提供的,会检查Android项目源文件的正确性.安全性.性能.可用性等潜在的bug并优化改进. 下图简单地描述了 ...

  8. Objective C静态代码扫描和代码质量管理 OClint + SonarQube

    OClint是针对C, C++及Objective C代码的静态扫描分析工具,而SonarQube是一个开源的代码质量管理平台.本文将实现将OClint的扫描结果导入到SonarQube中,已实现对O ...

  9. Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序

    静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...

随机推荐

  1. 2、linux防火墙的使用(firewalld)

    2.1.说明: 1.在 RHEL7 里有几种防火墙共存,firewalld.iptables,默认是使用 firewalld 来管理 netfilter 子系统,不过底层调用的命令仍然是 iptabl ...

  2. 一款好用的CRM系统为何很难被企业找到?

    如果您想要照明,买个灯具就能解决问题:如果您想要沟通,买个手机就能立刻打起电话:如果您要购买好用的CRM系统,那就没有这么简单了,无论是选型过程还是使用结果都十分复杂.做为想要使用CRM的潜在用户,您 ...

  3. CentOS-配置YUM源加速(阿里云、Nexus3)

    备份本地源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 配置CentOS6(aliyun ...

  4. MyBatis:条件构造器QueryWrapper方法详解

    QueryWrapper 说明:      继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaQueryWrapper, 可以通过 n ...

  5. linux下的压缩命令 tar zip gunzip

    p.p1 { margin: 0; font: 12px Arial; color: rgba(5, 42, 136, 1) } p.p2 { margin: 0; font: 12px " ...

  6. 桌面Linux系统的先驱者慕尼黑现在正在考虑切换回Windows

    From: http://arstechnica.com/business/2014/08/linux-on-the-desktop-pioneer-munich-now-considering-a- ...

  7. MindSpore模型精度调优实战:常用的定位精度调试调优思路

    摘要:在模型的开发过程中,精度达不到预期常常让人头疼.为了帮助用户解决模型调试调优的问题,我们为MindSpore量身定做了可视化调试调优组件:MindInsight. 本文分享自华为云社区<技 ...

  8. Linux | 浏览(切换)目录命令

    例出目录和文件 --> ls ls 命令是最常用的 Linux 命令之一,ls 是 list 的缩写,表示:列出 在 Linux 中 ls 命令用于列出文件和目录 一些常用的参数 ls -a # ...

  9. Java基础00-学生管理系统16

    1. 学生管理系统 1.1 项目演示 1.2 实现思路 1.3 定义学生类 public class Student { private String sid; private String name ...

  10. 论文阅读:Visual-Inertial Localization With Prior LiDAR Map Constraints

    介绍 提出了一个低代价双目视觉惯导定位系统,实现了基于多状态约束下的卡尔曼滤波器(MSCKF)VIO,采用了先验雷达地图.除了稀疏的视觉特征,雷达地图与半稠密的点云也通过紧耦合的MSCKF进行更新,进 ...