本申请涉及软件检测,特别是涉及一种源代码静态分析方法、装置、设备以及介质。
背景技术:
1、静态分析(static analysis)是一种在不执行代码的情况下检查源代码、二进制文件或其他中间表示形式以发现错误、漏洞、风格问题或不符合编码标准的技术。这种分析方法通过解析和检查代码的结构、语法、数据流、控制流等信息来工作的,不需要实际运行程序。
2、目前,传统的静态分析方法在针对c++语言代码进行检查时,存在检测精度较低的缺陷,因此亟需一种能够有效提高检测精度的静态分析方法。
技术实现思路
1、本申请的目的是提供一种源代码静态分析方法、装置、设备以及介质,能够提高c++语言代码静态检测精度。
2、为实现上述目的,本申请提供如下方案:
3、第一方面,本申请提供一种源代码静态分析方法,包括:基于源代码解析得到的抽象语法树,构建控制流图和函数调用图;利用所述函数调用图对所述控制流图进行到达定值分析,构建初始值流图;向所述初始值流图添加与c++语言参数相关的边,得到最终值流图;所述c++语言参数为基于所述抽象语法树所得到的参数节点和/或变量节点;基于所述最终值流图对所述源代码进行静态检测,得到静态检测结果。
4、可选地,所述向所述初始值流图添加与c++语言参数相关的边,得到最终值流图,包括:向所述初始值流图添加与宏分支节点相关的边,得到第一值流图;向所述第一值流图添加与全局变量相关的边,得到第二值流图;向所述第二值流图添加与类成员相关的边,得到第三值流图;向所述第三值流图添加与指针变量相关的边,得到第四值流图;向所述第四值流图添加与特殊函数的实参变量相关的边,得到最终值流图。
5、可选地,所述向所述初始值流图添加与所述宏分支节点相关的边,得到第一值流图,包括:遍历所述抽象语法树的所有节点,获取所述抽象语法树的预处理命令节点并提取所述预处理命令节点的头文件名和头文件;将提取到的所述预处理命令节点的头文件按照所述抽象语法树的执行顺序进行拼接,并在拼接的过程中基于确定的重复出现的头文件名过滤头文件,得到拼接抽象语法树;遍历所述拼接抽象语法树的所有节点,获取宏定义节点以及所述宏分支节点;向所述控制流图添加所述宏定义节点以及所述宏分支节点,得到第一控制流图;对所述第一控制流图进行到达定值分析,获取与所述宏定义节点以及所述宏分支节点相关的边;基于与所述宏定义节点以及所述宏分支节点相关的边去除所述初始值流图的非必要分支,得到第一值流图。
6、可选地,所述向所述第一值流图添加与所述全局变量相关的边,得到第二值流图,包括:遍历所述拼接抽象语法树的所有节点,获取所述拼接抽象语法树的全局变量;向所述第一控制流图添加所述全局变量,得到第二控制流图;基于所述第二控制流图和所述函数调用图,生成超图;以所述全局变量的相关节点作为起始节点遍历所述超图,对所述超图进行简化,得到稀疏图;对所述稀疏图进行到达定值分析,得到与所述全局变量相关的边;向所述第一值流图添加与所述全局变量相关的边。
7、可选地,所述向所述第二值流图添加与所述类成员相关的边,得到第三值流图,包括:遍历所述拼接抽象语法树的所有节点,获取所述拼接抽象语法树的类及对象,所述拼接抽象语法树的类包括成员变量和成员函数;向所述第二控制流图添加所述拼接抽象语法树的对象、所述拼接抽象语法树的类的成员变量和成员函数,得到第三控制流图;对所述拼接抽象语法树的对象以及所述拼接抽象语法树的对象的创建点进行附加签名,并对所述第三控制流图的所述成员函数进行到达定值分析,得到具有附加签名的边;利用静态修饰符对所述成员变量进行类签名,并对所述第三控制流图的带有类签名的所述成员变量进行到达定值分析,得到具有不同签名的边;获取所述拼接抽象语法树的析构函数,并向所述第三控制流图添加所述析构函数;对添加所述析构函数后的所述第三控制流图的析构函数进行到达定值分析,确定与所述析构函数相关的边;所述析构函数位于所述拼接抽象语法树的对象生命周期结束的节点或者对象生命周期被结束的节点;向所述第二值流图添加具有附加签名的边、具有类签名的边以及与所述析构函数相关的边。
8、可选地,所述向所述第三值流图添加与所述指针变量相关的边,得到第四值流图,包括:遍历所述拼接抽象语法树的所有节点,获取所述拼接抽象语法树的指针变量;所述指针变量为实参变量;向所述第三控制流图添加所述指针变量,获得第四控制流图;以所述指针变量的相关节点作为起始节点遍历所述第四控制流图和所述稀疏图,得到与所述指针变量相关的边;向所述第三值流图添加与所述指针变量相关的边。
9、可选地,所述向所述第四值流图添加与所述特殊函数的实参变量相关的边,得到最终值流图,包括:获取终端输入的所述特殊函数的名称以及待连线的参数位置信息;所述特殊函数为用户基于c++语言的库函数设置的自定义函数;基于所述特殊函数的名称查询所述第四控制流图,确定与所述特殊函数对应的实参变量;基于所述实参变量和所述待连线的参数位置信息,创建与所述实参变量相关的边;向所述第四值流图添加与所述实参变量相关的边。
10、第二方面,本申请提供一种源代码静态分析装置,包括:
11、解析构建模块,用于基于源代码解析得到的抽象语法树,构建控制流图和函数调用图;
12、分析构建模块,用于对所述控制流图和所述函数调用图进行到达定值分析,构建初始值流图;
13、节点添加模块,用于向所述初始值流图添加与c++语言参数相关的边,得到最终值流图;所述c++语言参数为基于所述抽象语法树所得到的参数节点和/或变量节点;
14、静态检测模块,用于基于所述最终值流图对所述源代码进行静态检测,得到静态检测结果。
15、第三方面,本申请提供一种计算机设备,包括:存储器、处理器以存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序以实现上述中任一项所述的源代码静态分析方法的步骤。
16、第四方面,本申请提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述中任一项所述的源代码静态分析方法的步骤。
17、第五方面,本申请提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现上述中任一项所述的源代码静态分析方法的步骤。
18、根据本申请提供的具体实施例,本申请公开以下技术效果:
19、本申请提供一种源代码静态分析方法、装置、设备以及介质,通过对源代码进行解析得到抽象语法树;根据抽象语法树构建控制流图和函数调用图;利用函数调用图对控制流图进行到达定值分析,可以构建初始值流图;通过对初始值流图添加与c++语言参数相关的边,得到最终值流图;利用最终值流图对c++语言的源代码缺陷进行静态检测,不仅降低因缺少与c++语言参数相关的边而导致的误报漏报的错误率,有效提高源代码静态检测的精度;而且能够更精准地表达源代码信息,方便开发者追溯源代码的缺陷。
1.一种源代码静态分析方法,其特征在于,所述源代码静态分析方法包括:
2.根据权利要求1所述的源代码静态分析方法,其特征在于,所述向所述初始值流图添加与c++语言参数相关的边,得到最终值流图,包括:
3.根据权利要求2所述的源代码静态分析方法,其特征在于,所述向所述初始值流图添加与所述宏分支节点相关的边,得到第一值流图,包括:
4.根据权利要求3所述的源代码静态分析方法,其特征在于,所述向所述第一值流图添加与所述全局变量相关的边,得到第二值流图,包括:
5.根据权利要求4所述的源代码静态分析方法,其特征在于,所述向所述第二值流图添加与所述类成员相关的边,得到第三值流图,包括:
6.根据权利要求5所述的源代码静态分析方法,其特征在于,所述向所述第三值流图添加与所述指针变量相关的边,得到第四值流图,包括:
7.根据权利要求6所述的源代码静态分析方法,其特征在于,所述向所述第四值流图添加与所述特殊函数的实参变量相关的边,得到最终值流图,包括:
8.一种源代码静态分析装置,其特征在于,所述源代码静态分析装置包括:
9.一种计算机设备,包括:存储器、处理器以存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序以实现权利要求1-7中任一项所述的源代码静态分析方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现权利要求1-7中任一项所述的源代码静态分析方法的步骤。