Biweek Report 20211201~20211214

双周汇报

2021~2022学年第一学期 第13、14周(2021年12月01日~2021年12月14日)

汇报人:汤伟杰 汇报时间:2021年12月6日

一、本周主要工作内容

  • 文献阅读:阅读了有关于缺陷定位、静态分析(尤其针对C语言)等相关的文献资料。

  • 学习工作:学习了基于Promise的http库axios的使用、配置以及模块封装;继续学习Vue框架,基于Vue搭建一个商场项目,项目地址:https://github.com/leibaio/supermall

    开始了解编译原理、软件静态分析相关知识;学习非关系型数据库Mongo相关知识;参加学校华为中国芯技术大赛,学习鲲鹏软件迁移相关知识;

二、阅读文献笔记及总结

文献:

[1] 方登辉. 基于抽象语法树的代码静态缺陷检测工具开发[D].北京邮电大学,2018.

[2] 刘海燕,杨洪路,王崛.C源代码静态安全检查技术[J].计算机工程,2004(02):28-30.

[3] 张亚楠,谢冬红,邵学彬.静态代码缺陷定位技术研究[J].信息与电脑(理论版),2017(23):16-19.

笔记:

[1]

  1. 文章完成了基于抽象语法树的静态代码检测工具的开发,使用Clang编译器将源代码转化为抽象语法树,分析缺陷代码和正常代码的差异性,记录区分差异性的关键信息,利用这些信息基于GJB安全规范和PVS缺陷库构建检测规则,之后便利语法树,遍历过程调用规则检测,记录违反规则的代码片段及错误信息,生成测试报告。

  2. 软件测试分类

  3. 针对缺陷间的差异性,很难找到统一的检测规则,为了解决问题,文章使用基于规则的检测方式,针对每条缺陷进行单独构造定制化检测规则。使用TDD开发模式,文章具体内容包括:缺陷库的构建;定制化检测规则的制定;基于测试驱动开发校验每条规则;开放测试;

  4. 文章中使用开源框架OCLINT构建一个静态检测工具,相应的检测架构如下:

    ​ 1)输入:规则库根据《GJB5369-2005航天型号软件C语言安全子集》代码编写规范和《PVS-Studio缺陷集》代码集合构成;测试代码库由测试人员依据检测规则构成,分为正常用例和缺陷实例。

    ​ 2)处理引擎:使用开源框架OCLINT。框架底层使用LLVM作为编译处理工具,使用Clang编译器将源代码转化为抽象语法树;分析缺陷代码和正常代码的差异性,记录区分差异性的关键信息;遍历语法树,提取关键信息;使用检测规则扫描代码,获取关键信息;检测是否违背设定,记录违背缺陷的信息,生成报告。

    ​ 3)输出:提供检测报告。包括源文件路径、缺陷行列位置、违反级别、违反的的规则类型、具体的规则名和提示的错误信息。

  5. 静态扫描流程:

    测试系统的功能:

  6. 静态分析工具实现:

    工具检测过程:首先项目检查前,对C/C++工程文件进行解析,获取编译项和依赖库,生成编译数据库,然后将编译数据库中每个文件使用clang编译器转化为抽象语法树,之后遍历抽象语法树并加载规则库中每条规则,最后规则将遍历语法树中获取的信息进行分析,判断是否违背规则,并将违背信息汇总生成测试报告。

    具体实现包括:1)规则集的创建;2)将规则封装为第三方动态库。使用OCLINT命令将编写的规则库转换为动态调用库;3)工具的创建。使用OCLINT命令将编写的代码生成可执行文件,添加到系统路径。

  7. 抽象语法树是编译器经过语义分析后插入语义信息生成的,包含源代码执行逻辑的全部信息。是基于抽象语法结构将源代码转化为树形结构的一种表示方式,描述如何从文法结构推导程序语言中的语句的过程。下图为辗转相除法源代码和对应的抽象语法树结构:

      根结点为语句序列,表示程序入口。叶节点表示终止符,就是源代码中的标识符。编译器在词法分析后获得源代码的基本单元,经过语法分析获得源代码的执行流程生成抽象语法树。每条语法规则代表一种语句类型,以父节点生成,内部执行逻辑以父节点为根节点在孩子节点展开。
    
  8. 抽象语法树构造:

    经过词法、语法和语义三个阶段分析生成。语法树结构是对源代码高层次语义理解的结果,包含文法和语义信息。

  9. 文章分别介绍从语法树中提取上下文信息、提取程序结构信息、提取控制流信息、提取数据流信息四类信息。通过提取信息和具体缺陷结合,将缺陷大致分为七种类型:重复代码错误、数值范围、越界、控制流、数据流、函数调用、代码格式,以此展开依次进行描述。

  10. 规则构建:

规则构建实际是缺陷特点和语法树信息融合过程。整体架构分为分析设计、编码实现和测试校验三个部分。规则构建具体内容:1)确定规则基本信息 2)分析缺陷代码结构,给出算法思路 3)规则实现及有效性检测。文章使用基于GoogleTest测试框架编写测试用例对编写规则进行测试。

[2] [3]

  1. 静态代码缺陷分类:缓冲区溢出、空指针引用异常、数据类型转换异常、整数溢出漏洞、内存泄露
  2. 静态分析技术:词法分析、语义分析、控制流分析、数据流分析

三、下周工作重点及周计划(方案)

  • 继续阅读有关于缺陷定位的文献资料,针对本次报告第一篇论文涉及知识点进行深入研究

  • 学习编译原理、程序静态分析相关课程,对于抽象语法树进行了解

  • 继续搭建商城项目,练习Vue框架