【Lua篇】静态代码扫描分析(四)规则检查
一、前言
通过前面三篇文章已经初步实现了将Lua源代码文件读取解析成语法树,现在就可以通过得到的语法树进行指定规则的代码扫描检查。下图简单列举了一下单个Lua文件内部的语法关系情况(注意并非真正的类图,也没有列举完全部的节点类型)。

二、变量作用域
1 function main()
2 local value = g_total + 1
3 print("value:", value)
4 end
上面的简单代码里有一个g_total的全局变量,它可能来自前面代码块的定义,也有可能来自底层导出的符号,或者是在其他文件中定义的全局变量。因此在判断一个变量是否存在首先需要创建一个全局的变量列表或白名单列表。
1 function demo(params)
2 local value1 = 1
3 if value1 == params then
4 local var_b = 2
5 local var_c = var_b + value1
6 end
7 end
上面代码也是一个函数声明,它有自己的私有变量列表(包括参数params和内部的变量value1);而var_b、var_c则属于是if内部的私有变量列表,在if之外是无法访问的。因此在代码扫描之前需要先建立不同参数的作用域。
先对所有文件的语法树扫描一遍,把里面的所有变量都记录下来,存入全局变量列表、当前文件变量列表、或者某个内部代码块的变量列表。然后再才对单个文件进行规则扫描。特别需要注意module方法声明的模块,内部的不加local的变量属于module的公共变量。
1 def build_symbols(block):
2 # block参数就是当前文件的全部代码
3 for statement in block.statements:
4 # 变量声明,属于block的自私变量列表
5 if statement.nodeType == LNodeCode.IDENTIFIER:
6 # 赋值包括a=1 和 a,b =1,2 等复杂的赋值语句
7 # 没有加local的情况下,很可能是全局变量
8 elif statement.nodeType == LNodeCode.ASSIGNMENT:
9 # 函数定义,需要检查函数体内部的语句statement.block
10 # 递归调用build_symbols检查
11 elif statement.nodeType == LNodeCode.FUNC:
12 # 函数调用类似 module("test",seeall)模块声明, 全局的test
13 # 类似 CreateClass("A", superB) ,全局的A
14 elif statemen
三、规则扫描
根据需要进行的一系列的规则进行语法树扫描检查,以检查变量是否存在为例:
1. 检查变量时需要先在局部变量列表中查找(if、for等代码块;函数代码块;文件代码块等)
2. 没有找到再去模块的公共变量列表(module)
3. 最后去全局变量列表中查找
4. 如果都没有找到的话那么就很可能这个变量不存在。
1 if statement.nodeType == LNodeCode.IDENTIFIER:
2 # 单个变量的声明只有可能是local a
3 check_var(statement.name, statement.is_local)
4 elif statement.nodeType == LNodeCode.FUNC_CALL:
5 # 函数调用的参数检查
6 check_multi_vars(statement.args)
7 # 函数本身检查,看是否有这样的函数
8 check_func(statement.name)
9 elif statement.nodeType == LNodeCode.OP:
10 # 操作例如+-*/%等,需要检查左右的操作变量是不是存在
11 check_left_vars(statement.left)
12 check_right_vars(statement.right)
同样也是遍历文件的block、函数体block、各种语句的block进行变量的存在性检查,具体的内部检查由于代码篇幅太长,就不详细贴出来了。
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 ...
随机推荐
- python之循环与判断
1,for 循环,语法 举例: for i in range(1, 5, 2): # 0,1,2,3,4 print(i) for a in range(5):# --(0,5,1) 0,1,2,3, ...
- 18、linux文件属性
文件的描述信息: [root@centos6 /]# ls -lih 总用量 118K 3538945 drwxr-xr-x 3 root root 4.0K 8月 23 17:12 app 3276 ...
- 1、centos7修改网卡名称为传统的eth0
[root@localhost ~]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]#mv ifcfg-ens ...
- 为什么要鼓励小型企业使用CRM系统
如果你是一家小公司的管理者,我相信你必须对工作流程.客户.市场销售.市场营销推广等业务流程进行总体规划和管理方法,这往往会使你的心有馀而力不足,引起 繁忙.心有馀而力不足.交流受到阻碍.管理方法和这样 ...
- Linux:阿里云设置安全组开放对应端口过程
手动添加后 保存就可以了.
- Ubuntu创建图标
起因 安装一些软件时,总是没有图标,导致无法固定到docky栏,所以极为不方便,所以需要自己创建图标. 操作 以创建微信图标为例 [Desktop Entry] Name=Wecaht #名字 Com ...
- Linux导出未越狱Iphone10.3-QQ聊天记录
起因 手机当中的聊天记录已经快两年没有备份了,生怕某天QQ版本升级中丢失掉这些聊天记录,所想将这两年的聊天记录保存下来 查找了好多资料,结果10.3以后,IOS改变了策略,貌似不允许通过以前方法导出了 ...
- robotframework使用过程中的一些总结
p.p1 { margin: 0; font: 20px "Helvetica Neue"; color: rgba(53, 53, 53, 1) } p.p2 { margin: ...
- 我是如何用redis做实时订阅推送的(转)
前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的. 先说一下领劵中心的项目吧,这个项目就类似京东app的领劵中心,当然图是截取京东的,公司的就不截了... 其中 ...
- 官宣.NET 6 预览版4
我们很高兴发布 .NET 6 Preview 4.我们现在大约完成了 .NET 6 发布的一半.现在是一个很好的时机,可以再次查看.NET6的完整范围.许多功能都接近最终形式,而其他功能将很快推出,因 ...