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

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

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


一、前言


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


微信图片_20220424141935.png


二、变量作用域


function main()
    local value = g_total + 1
    print("value:", value)
end


   上面的简单代码里有一个g_total的全局变量,它可能来自前面代码块的定义,也有可能来自底层导出的符号,或者是在其他文件中定义的全局变量。因此在判断一个变量是否存在首先需要创建一个全局的变量列表或白名单列表。


function demo(params)
  local value1 = 1
  if value1 == params then
    local var_b = 2
    local var_c = var_b + value1
  end
end


   上面代码也是一个函数声明,它有自己的私有变量列表(包括参数params和内部的变量value1);而var_bvar_c则属于是if内部的私有变量列表,if之外是无法访问的。因此在代码扫描之前需要先建立不同参数的作用域。


   先对所有文件的语法树扫描一遍,把里面的所有变量都记录下来,存入全局变量列表、当前文件变量列表、或者某个内部代码块的变量列表。然后再才对单个文件进行规则扫描。特别需要注意module方法声明的模块,内部的不加local的变量属于module的公共变量


def build_symbols(block):
  # block参数就是当前文件的全部代码
  for statement in block.statements:
    # 变量声明,属于block的自私变量列表
    if statement.nodeType == LNodeCode.IDENTIFIER:
    # 赋值包括a=1 和 a,b =1,2 等复杂的赋值语句
    # 没有加local的情况下,很可能是全局变量
    elif statement.nodeType == LNodeCode.ASSIGNMENT:
    # 函数定义,需要检查函数体内部的语句statement.block
    # 递归调用build_symbols检查
    elif statement.nodeType == LNodeCode.FUNC:
    # 函数调用类似 module("test",seeall)模块声明, 全局的test
    # 类似 CreateClass("A", superB) ,全局的A
    elif statement.nodeType == LNodeCode.FUNC_CALL:


三、规则扫描


   根据需要进行的一系列的规则进行语法树扫描检查,以检查变量是否存在为例:


   1. 检查变量时需要先在局部变量列表中查找(if、for等代码块;函数代码块;文件代码块等)


   2. 没有找到再去模块的公共变量列表(module)


   3. 最后去全局变量列表中查找


   4. 如果都没有找到的话那么就很可能这个变量不存在。


if statement.nodeType == LNodeCode.IDENTIFIER:
  # 单个变量的声明只有可能是local a
  check_var(statement.name, statement.is_local)
elif statement.nodeType == LNodeCode.FUNC_CALL:
  # 函数调用的参数检查
  check_multi_vars(statement.args)
  # 函数本身检查,看是否有这样的函数
  check_func(statement.name)
elif statement.nodeType ==  LNodeCode.OP:
  # 操作例如+-*/%等,需要检查左右的操作变量是不是存在
  check_left_vars(statement.left)
  check_right_vars(statement.right)


   同样也是遍历文件的block、函数体block、各种语句的block进行变量的存在性检查,具体的内部检查由于代码篇幅太长,就不详细贴出来了。


   Lua静态代码扫描的基本处理方法就算列举完了,实际项目的代码中会比较复杂,而且扫描的规则也会有很多不同的需求,就需要实际去做才理解了。


欢迎微信搜索"游戏测试开发"关注一起沟通交流。

相关文章
|
7月前
|
C++ 索引 Python
Lua中self 、自索引及其面向对象应用代码示例
Lua中self 、自索引及其面向对象应用代码示例
|
6月前
|
监控 数据处理 开发者
利用Lua代码简化局域网管理软件开发
使用Lua脚本语言可以提升局域网管理软件的开发效率和代码可维护性。示例包括:使用LuaSocket扫描局域网设备;通过动态加载和应用配置文件展示配置管理;利用实时监控功能,当网络流量超过阈值时触发警报;以及通过HTTP POST自动提交监控数据到服务器。Lua的简洁语法和强大功能简化了网络管理和自动化任务。
121 3
|
6月前
|
数据挖掘 Linux 数据处理
探索Linux下的Lua命令:轻量级脚本语言在数据处理和分析中的应用
**探索Linux上的Lua:轻量级脚本语言用于数据处理。Lua通过命令行解释器执行,适用于游戏开发、数据分析及自动化。特点包括小巧、高效、可扩展和动态类型。使用`lua`或`luajit`,配合-e、-l、-i参数执行脚本或互动模式。示例:执行`hello.lua`脚本打印"Hello, Lua!"。最佳实践涉及版本兼容、性能优化、使用C API、测试和文档编写。**
|
6月前
|
JSON 监控 数据格式
使用Lua代码扩展上网行为管理软件的脚本功能
本文介绍了如何使用Lua脚本增强上网行为管理,包括过滤URL、记录用户访问日志、控制带宽和自动提交监控数据到网站。Lua是一种轻量级语言,适合编写扩展脚本。文中提供多个示例代码,如URL过滤器、用户活动日志记录器和带宽控制器,帮助用户根据需求定制网络管理功能。通过这些示例,用户可以快速掌握Lua在上网行为管理中的应用。
180 4
|
7月前
|
存储 监控 数据管理
Lua代码解析:实现上网行为监管软件的自定义规则引擎
在当今数字化时代,网络安全和数据隐私保护备受关注。为了确保网络安全和合规性,许多组织和机构需要监管和管理其员工或用户的上网行为。为了实现这一目标,开发一款高效的上网行为监管软件至关重要。本文将介绍如何使用Lua语言开发一种自定义规则引擎,以实现上网行为监管软件的自定义规则引擎。
232 0
|
JavaScript 前端开发 C++
[√]lua binding模版文件分析
[√]lua binding模版文件分析
82 0
|
网络协议 C语言
Wireshark lua dissector 对TCP消息包合并分析
Wireshark lua dissector 对TCP消息包合并分析
832 0
|
C++
[✔️]unreal插件lua-profiler:分析lua性能
[✔️]unreal插件lua-profiler:分析lua性能
386 0
|
消息中间件 数据采集 Java
Lua集成kafka第三方插件代码介绍|学习笔记
快速学习Lua集成kafka第三方插件代码介绍
Lua集成kafka第三方插件代码介绍|学习笔记