一、实习项目
1. 基于RM链路的UT&重构
(1)背景
RM链路: 我实习的部门是基带5G开发部,做的是5G基带的上行开发,上行就是从终端到基站,代码用处理从终端发来的信号。在做测试的时候,就需要构造外部的终端信号,RM链路就是上行开发过程中用于模拟生成终端数据灌入基带上行入口的测试工具。主要用于系统测试和上板验证测试。
注:RM链路是随机链路。用于多用户多小区等复杂场景,做补充测试。
这个工具历史比较久远, 工具的代码有些地方不符合clean code,架构存在不合理的地方,目前也没有对该工具功能性的看护,所以要通过一些UT对其功能进行看护,然后通过重构来使代码更加简洁更加符合clean code。
(2)工作内容
目标模块: PrachSignalGen
Prach(物理随机接入信道): 随机接入终端给基站发送的第一部消息
随机接入:终端不知道周围有没有小区,小区也不知道周围有什么终端,终端和小区建立联系的过程叫随机接入的过程。终端首先搜索小区的广播信息,识别到小区以后,终端向基站发送Prach信号,基站在规定的时间规定的位置进行盲检,如果检测到终端的信号就进入后续的随机接入的流程
流程:preamble序列生成->PRACH资源映射->进行IDFT->滤波增益调整->加重复结构->加CP->上采样滤波->PRACH频谱搬移->时域功率调整->数据映射
整个项目是实习生合作,我负责的是上采样滤波模块的重构,滤波上采样算法将较低采样率下的N_MapFFT * N_RachScPerDataSc点preamble数据上采样到系统采样率N_FFT * N_RachScPerDataSc点下,并滤除镜像成分。整个过程对CP和preamble以及重复preamble进行滤波。
(3)成果
UT部分:
- 根据参数文档,自行设计测试用例
- 利用当前基线RM链路版本生成比对数据
- 编写UT用例,进行UT测试
重构部分:
- 学习代码坏味道,学习基本的重构方法
- 识别出代码中的坏味道并进行小范围重构
- 修改的坏味道:重复代码、switch惊悚现身、魔法数字、函数过长、过长的参数列表
(4)思考体会
重构定义: 在不改变代码外在行为的前提下,对代码进行修改以改进程序的内部结构
UT测试流程:
- 测试套在SetUp时实例化出PRACH_TOP类的实例
- 提取公共函数RunCase(string folderName)
- 测试流程为先读入UT数据路径(包含Prach_Cfg.txt,ref3文件夹)
- 调用readPara()进行输入参数读入
- 调用run()进行信号生成
- 调用fileCompara_UT()进行UT数据比对
- 最终通过EXPECT_EQ(0,cmpRes)判断比对是否成功
二、基于CSA的程序静态分析规则开发
CSA是clang static analyzer
- Clang是一个编译器前端,它目前支持C、C++等编程语言,Clang对源程序进行词法分析和语义分析,并将分析结果转换为AST(Abstract
Syntax Tree,抽象语法树),Clang最后使用LLVM(Low Level Virtual
Machine)作为后端代码的生成器。
- Clang Static Analyzer是一种基于符号执行技术进行路径敏感分析的代码分析,符号执行引擎并不直接进行报错,而是由挂在在引擎上的Checker对程序状态进行检查并告警。
- 在实际运行过程中,Clang的静态分析器首先通过程序代码,生成AST(抽象语法树),然后根据AST生成CFG(控制流图),通过符号执行生成扩展图(Exploded Graph)。
- Clang Static Analyzer的分析分为路径敏感的分析和语法层级的分析。对于两者的区别,我个人的理解是路径敏感的分析是需要你利用约束求解遍历程序所有可能路径来判断某一错误有没有可能发生;而语法层级的分析就是不需要遍历所有路径,只需要找到对应的语法错误就可以,例如我们要寻找delete this,我们只需要找到delete,判断它的对象是不是this即可,不关注遍历所有路径。因此,语法层级的分析只需要AST即可完成,而路径敏感的分析需要在CFG上进行符号执行得到扩展图才能得到足够的信息。
问题:检测for循环中数组下标是否使用错误,每次循环下标为固定值
解决方案:
- 判断当前语句是否为声明语句(int a = 0, int a = b, int a = b[i]等)或者是否存在二元运算符,如果是进入步骤2或3,否则退出
- 如果是声明语句,将当前语句作为目标语句
- 如果是存在二元操作符,则获取二元操作符,判断是否为等号,既判断当前语句是否为赋值语句,如果是,则将等号右侧表达式作为目标语句
- 对目标语句进行判断:
(1) 查找目标语句是否存在数组下标
(2) 如果存在数组下标,则进行标记,否则退出
(3) 如果被标记,获取数组下标,并判断是否为常量
(4) 如果数组下标是常量,则判断目标语句是否在for循环内,如果在,则告警
疑难:
- 如何判断语句是否在for循环内?
在当前程序的AST中进行操作,从当前节点向上遍历直至根节点,在这个过程中判断是否有Stmt为ForStmt
符号执行是一种程序分析技术,使用符号值而不是实际值作为程序的输入,解释器在这些符号值作为输入的前提下,对程序语句逐条执行。