CN115080448B - 一种软件代码不可达路径自动检测的方法和装置 - Google Patents
一种软件代码不可达路径自动检测的方法和装置 Download PDFInfo
- Publication number
- CN115080448B CN115080448B CN202210888454.1A CN202210888454A CN115080448B CN 115080448 B CN115080448 B CN 115080448B CN 202210888454 A CN202210888454 A CN 202210888454A CN 115080448 B CN115080448 B CN 115080448B
- Authority
- CN
- China
- Prior art keywords
- path
- unreachable
- constraint
- code
- function
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3612—Software analysis for verifying properties of programs by runtime analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/425—Lexical analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种软件代码不可达路径自动检测的方法和装置,包括开展软件代码不可达路径类型的识别和分析;基于词法语法语义分析进行代码解析,提取代码元数据,生成函数调用关系图和控制流图;针对跳转不可达路径,开展基于控制流的不可达路径自动检测;针对控制不可达路径,开展基于函数调用的不可达路径自动检测;针对静态约束不可达,开展基于符号执行和约束求解的不可达路径自动检测;针对运行态约束不可达,开展基于动态仿真的不可达路径自动检测;保存检测结果;如检测到相匹配的不可达路径,则记录到结果文件中。本发明为更全面检测不可达路径和降低检测漏报误报率提供了方法指导,也为不可达路径自动检测提供工具手段。
Description
技术领域
本发明涉及软件代码检测技术领域,尤其涉及一种软件代码不可达路径自动检测的方法和装置。
背景技术
大型软件代码结构复杂,规模庞大,代码中含有大量的判断分支或循环语句,因此包含的路径数量也非常多。由于设计不合理或编程人员编程习惯不良等原因,可能会存在大量的不可达路径,即软件无论什么情况下,没有输入能执行该路径。如代码if (i>10){if (i<0) {i++;tmp=tmp*5;},其中{i++;tmp=tmp*5;}这条路径无论i取什么值都无法执行,这就是一条不可达路径。不可达路径是软件开发中易出现的一类代码缺陷,也是软件白盒测试中重点要检测的一类缺陷。很多软件相关人员尤其是开发人员认为不可达路径对软件质量影响不大,仅仅增加了代码的存储容量,降低了代码的可读性而已。事实上不尽其然,在无特殊要求下是不会设计出不可达路径的,所以正常的代码中是不应该存在不可达路径的。而且有些不可达路径往往是某些逻辑问题的征兆,可以导致软件***失效,对于航空、航天等行业的软件,出现这样的缺陷往往会带来灾难性的后果,引起软件可靠性安全性问题。因此,对于软件测试人员来说,尽量全面地找出存在的不可达路径是一项非常关键的任务,有必要对不可达路径进行分析研究。面对十万乃至百万行的大型程序,仅仅依赖人工检测不可达路径效率往往很低,因此开展软件代码不可达路径的自动检测方法研究是很重要的。
目前经过国内外学者的不断研究,已有许多不可达路径的研究成果,例如静态的检测方法、动态的检测方法和二者相结合的检测方法。目前这些检测方法的研究存在两个主要问题:一是仅侧重于某一种方法层面的研究,对不可达路径的类型研究不够;二是还不能很有效解决漏报误报的问题。
发明内容
本发明目的是提供了一种软件代码不可达路径自动检测的方法和装置,以解决上述问题。
本发明解决技术问题采用如下技术方案:
一种软件代码不可达路径自动检测的方法,包括:
步骤(1),开展软件代码不可达路径类型的识别和分析;将软件代码不可达路径类型划分四类:跳转不可达、控制不可达、静态约束不可达和运行态约束不可达;
步骤(2),输入软件代码,对软件代码进行处理;基于词法语法语义分析进行代码解析,提取代码元数据,生成函数调用关系图和控制流图;
步骤(3),基于步骤(2)生成的控制流图,针对跳转不可达路径,开展基于控制流的不可达路径自动检测;
步骤(4),基于步骤(2)生成的函数调用关系图,针对控制不可达路径,开展基于函数调用的不可达路径自动检测;
步骤(5),基于步骤(2)的结果,针对静态约束不可达,开展基于符号执行和约束求解的不可达路径自动检测;
步骤(6),基于步骤(5)的结果,针对运行态约束不可达,开展基于动态仿真的不可达路径自动检测;
步骤(7),保存检测结果;在步骤(3)~步骤(6)中如检测到相匹配的不可达路径,则记录到结果文件中,包括不可达路径所在函数名、开始行号、结束行号以及不可达路径类型。
进一步的,跳转不可达路径为:使用了包括return, break, exit, goto的跳转语句,并且这些跳转语句不是顺序执行的一组语句的最后一条语句,导致从使用跳转语句的下一行直到这组顺序执行的一组语句的最后一行组成的路径成为跳转不可达路径;
控制不可达路径为:某个函数不被任何其他函数调用,即无法同其它代码相关联的代码块,成为孤岛函数,导致这个函数内部的所有路径均为控制不可达路径;
跳转和控制不可达路径由代码的语句构成决定的,由不当的设计导致的,同数据无关。
进一步的,静态约束不可达路径和运行态约束不可达路径,均属于约束不可达路径,因程序结构中存在条件结构和循环结构,使得程序控制图中存在分支节点;分支节点至少存在两条路径分支:一条为取值为真的路径分支;另一条是取值为假的路径分支;当分支条件不满足时,即分支约束问题无解,导致不满足的那条分支成为约束不可达路径;
不考虑被检查对象在实际运行过程中的数据约束条件,而是将输入数据抽象为可取任意值,将这种检测称为静态约束不可达检测;
如考虑输入被检对象在运行过程中的数据约束条件则这种检测称为运行态约束不可达检测。
进一步的,软件代码的处理包括以下步骤:
Ⅰ代码预处理:主要对源代码的内容进行整理,得到完整、直观且语义清晰的预处理后文件;
Ⅱ代码格式化:进行代码扫描时一行代码最多允许包含一条语句或者一个语义单位,而被分析的源代码不一定满足此要求,需要对预处理后的文件按照统一的标准进行格式化处理;格式化的同时记录下必要的格式化信息,包括源文件与格式化文件的行号对照表、格式变动信息的内容;格式化完成后,在对格式化后的文件进行代码解析;
Ⅲ元数据提取:对格式化后的源代码文件进行解析,从中准确的提取出变量、关键词、函数调用以及变量使用的信息,所有这些信息构成了代码元数据集合;
Ⅳ函数调用关系图构建:基于函数调用图的定义,逐个分析函数中定义的所有代码,若存在函数调用的情况,确定其主调函数,然后在利用存储的函数摘要信息查找该函数对应的调用关系,从而构建函数调用关系图;
Ⅴ控制流图生成:基于控制流的定义,获取所需的节点、边、入口基本块以及出口基本块的控制流所需信息,并对获取的信息进行存储,从而生成控制流图。
进一步的,开展基于控制流的不可达路径自动检测的方法为:基于控制流分析通过检测跳转关键词后面的语句是否与跳转关键词属于同一基本块来判断其是否存在跳转不可达路径。
进一步的,开展基于函数调用的不可达路径自动检测的方法为:结合函数调用关系分析是否存在孤岛函数来判断是否存在控制不可达路径。
进一步的,开展基于符号执行和约束求解的不可达路径自动检测,包括如下步骤:
①深度优先遍历函数控制流图并生成函数的执行路径集合;
②利用符号执行获取每条执行路径上每个节点的符号表示;
③提取分支节点的分支约束信息,含变量、变量域及约束条件集;
④针对每条执行路径中每个分支节点,使用可满足性模理论SMT算法对分支节点的约束条件进行求解;
⑤如分支节点的约束问题有解,则重复③~④直到所有路径所有分支均已求解完毕;如分支节点的约束问题无解,则判断存在静态约束不可达路径,转入⑥;如分支节点的约束问题无法判断,则利用动态仿真的方法进行检测;
⑥记录静态约束不可达路径。
进一步的,开展基于动态仿真的不可达路径自动检测,包括如下步骤:
(A)变量类型解析:将分支节点的约束变量分为简单变量类型和复合变量类型,编程语言语法所定义的基本数据类型为简单变量类型;其余为复合变量类型;
(B)数据抽象模型构建:对于复合变量类型,不能通过输入一个数据值实现变量数据的输入及存储,需要根据具体的变量类型逐层分析以构建数据抽象模型,以“树”的形式存储变量数据;
(C)变量域数据集合的输入及存储:变量域具有集合特性,分为两类:区间和集合;在输入界面中,输入集合数据并存储,实现变量域数据集合的录入及存储;
(D)对软件代码进行动态仿真,在静态状态下以仿真的方式模拟软件的动态执行,记录动态仿真结果;
(E)如动态仿真结果有解,则本次检测结束;如动态仿真结果无解,则判断存在运行态约束不可达路径,转入(F);
(F)记录运行态约束不可达路径。
一种软件代码不可达路径自动检测装置,包括:
源代码文件管理模块,用于导入被检测C语言代码文件,并对其进行增加、删除、修改操作;
源代码处理模块,用于自动对软件代码进行处理,提取所需的代码元数据,构建函数调用关系图和控制流图;
不可达路径检测模块,用于依据所提基于函数调用和控制流、符号执行和约束求解、动态仿真四类不可达路径检测方法对源代码执行不可达路径检测;
检测结果管理模块,用于提供不可达路径检测结果的图形用户界面显示和文件输出;
回归检测模块,用于对修改后的代码进行回归检测。
进一步的,不可达路径检测模块包括基于控制流图的不可达路径检测子模块、基于函数调用的不可达路径检测子模块、基于符号执行和约束求解的不可达路径检测子模块以及基于动态仿真的不可达路径检测子模块,能够自动检测软件代码中是否存在跳转不可达路径、控制不可达路径、静态约束不可达路径和运行态约束不可达路径,检测过程中能显示检测进度,并保存检测结果。
有益效果:
(1)提出的静态分析和动态仿真相结合的不可达路径自动检测技术,可以更全面更正确地检测不可达路径。静态分析检测法可以检测跳转不可达、控制不可达和静态约束不可达路径;动态仿真检测法可以检测运行态约束不可达路径,从而降低检测结果的漏报率和误报率。
(2)提出的数据集合的抽象模型构建方法,在对数据类型充分解析的基础之上,通过对不同数据类型操作方式的抽象,实现对C语言的任意类型数据集合以标准化格式存储,为数据交换以及深层次的应用打下了坚实的基础,能极大地提高基于动态仿真不可达检测的可行性和实用性。
(3)研制的代码不可达路径检测装置,能对被导入检测的C语言代码开展自动不可达路径检测,以图形用户界面显示检测结果,能提高不可达路径检测效率。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的实施过程和细节,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明的方法流程图。
图2为软件代码不可达路径自动检测的方法总体方案示意图;
图3为软件代码解析技术方案示意图;
图4为基于符号执行和约束求解的不可达路径自动检测技术方案示意图;
图5为数据抽象模型构造流程示意图;
图6为变量域数据集合的存取流程示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
参考图1,本发明公开了一种软件代码不可达路径自动检测的方法,包括:
步骤(1),开展软件代码不可达路径类型的识别和分析;将软件代码不可达路径类型划分四类:跳转不可达、控制不可达、静态约束不可达和运行态约束不可达;
步骤(2),输入软件代码,对软件代码进行处理;基于词法语法语义分析进行代码解析,提取代码元数据,生成函数调用关系图和控制流图;
步骤(3),基于步骤(2)生成的控制流图,针对跳转不可达路径,开展基于控制流的不可达路径自动检测;
步骤(4),基于步骤(2)生成的函数调用关系图,针对控制不可达路径,开展基于函数调用的不可达路径自动检测;
步骤(5),基于步骤(2)的结果,针对静态约束不可达,开展基于符号执行和约束求解的不可达路径自动检测;
步骤(6),基于步骤(5)的结果,针对运行态约束不可达,开展基于动态仿真的不可达路径自动检测;
步骤(7),保存检测结果;在步骤(3)~步骤(6)中如检测到相匹配的不可达路径,则记录到结果文件中,包括不可达路径所在函数名、开始行号、结束行号、不可达路径类型等。
本实施例中,跳转不可达路径为:跳转不可达路径是指使用了包括return,break, exit, goto等跳转语句,并且这些跳转语句不是顺序执行的一组语句的最后一条语句,导致从使用跳转语句的下一行直到这组顺序执行的一组语句的最后一行组成的路径成为跳转不可达路径。
控制不可达路径是指某个函数不被任何其他函数调用,即无法同其它代码相关联的代码块,成为孤岛函数,导致这个函数内部的所有路径均为控制不可达路径。
跳转和控制不可达路径由代码的语句构成决定的,或者说是不当的设计导致的,同数据无关。
本实施例中,静态约束不可达路径和运行态约束不可达路径,均属于约束不可达路径,因程序结构中存在条件结构和循环结构,使得程序控制图中存在分支节点;分支节点至少存在两条路径分支:一条为取值为真的路径分支;另一条是取值为假的路径分支;当分支条件不满足时,即分支约束问题无解,导致不满足的那条分支成为约束不可达路径;
不考虑被检查对象在实际运行过程中的数据约束条件,而是将输入数据抽象为可取任意值,将这种检测称为静态约束不可达检测;
如考虑输入被检对象在运行过程中的数据约束条件则这种检测称为运行态约束不可达检测。
约束不可达路径从设计上来说相关语句是可达的,但是由于受到数据的影响,导致了设计上可达,但结果上却不可达。
本实施例中,代码处理层这部分细分为三方面内容:函数调用关系图构建和函数控制流图生成,其中代码解析器是基础,包含代码预处理、代码格式化和元数据提取。
函数调用关系图是从源代码中提取的表示函数逻辑关系的一种有向图,是对上下文函数关系之间的静态表述。有向图则提供了一种函数之间关系的形式化表示方法,即表示为G=(V, E)。其中V代表函数调用图中结点的集合;E代表函数调用图中结点到结点的有向边集合。
控制流图是以基本块为节点的有向图。所谓基本块,是代码中具有唯一入口和唯一出口的语句序列,其中不包含条件转移语句。基本块中的语句在代码执行过程中要么全都执行,要么全都不执行。形式化地说,控制流图是一个有向图G=<N , E , s, f>,其中N是节点的集合,表示代码中的基本块;E⊂N×N表示边的集合,如果有从Bi转向Bj的语句,则在G中有一条从Bi到Bj的有向边,记作e= ( Bi , Bj )∈E;s和f分别表示控制流图的起点和终点,对应于程序中的入口基本块和出口基本块。控制流图中的路径(path)描述了代码的一次具体执行过程。
软件代码的处理包括以下步骤:
Ⅰ代码预处理:主要对源代码的内容进行整理,得到完整、直观且语义清晰的预处理后文件;例如对于用C语言编写的源码,需要进行宏替换、预编译语句解析以及包含文件处理等。
Ⅱ代码格式化:通常情况下,具体进行代码扫描时一行代码最多允许包含一条语句或者一个语义单位,而被分析的源代码不一定满足此要求,因此需要对预处理后的文件按照统一的标准进行格式化处理。格式化的同时记录下必要的格式化信息,包括源文件与格式化文件的行号对照表、格式变动信息等内容。格式化完成后,在对格式化后的文件进行代码解析;
Ⅲ元数据提取:对格式化后的源代码文件进行解析,从中准确的提取出变量、关键词、函数调用、变量使用等信息,所有这些信息构成了代码元数据集合。
Ⅳ函数调用关系图构建:基于函数调用图的定义,逐个分析函数中定义的所有代码,若存在函数调用的情况,确定其主调函数,然后在利用存储的函数摘要信息查找该函数对应的调用关系,从而构建函数调用关系图。
Ⅴ控制流图生成:基于控制流的定义,获取所需的节点、边、入口基本块、出口基本块等控制流所需信息,并对获取的信息进行存储,从而生成控制流图。
本实施例中,开展基于控制流的不可达路径自动检测的方法为:基于控制流分析通过检测跳转关键词后面的语句是否与跳转关键词属于同一基本块来判断其是否存在跳转不可达路径。
本实施例中,开展基于函数调用的不可达路径自动检测的方法为:结合函数调用关系分析是否存在孤岛函数来判断是否存在控制不可达路径。
本实施例中,开展基于符号执行和约束求解的不可达路径自动检测,包括如下步骤:
①深度优先遍历函数控制流图并生成函数的执行路径集合;
②利用符号执行获取每条执行路径上每个节点的符号表示;
③提取分支节点的分支约束信息,含变量、变量域及约束条件集;
④针对每条执行路径中每个分支节点,使用可满足性模理论SMT算法对分支节点的约束条件进行求解;
⑤如分支节点的约束问题有解,则重复③~④直到所有路径所有分支均已求解完毕;如分支节点的约束问题无解,则判断存在静态约束不可达路径,转入⑥;如分支节点的约束问题无法判断,则利用动态仿真的方法进行检测;
⑥记录静态约束不可达路径。
本实施例中,开展基于动态仿真的不可达路径自动检测,包括如下步骤:
(A)变量类型解析:变量类型解析。将分支节点的约束变量分为简单变量类型和复合变量类型。编程语言语法所定义的基本数据类型为简单变量类型,如int、float、char和枚举等类型;其余为复合变量类型,如指针、数组和结构体等类型。
(B)数据抽象模型构建:对于复合变量类型,不能通过输入一个数据值实现变量数据的输入及存储,需要根据具体的变量类型逐层分析以构建数据抽象模型,以“树”的形式存储变量数据。在用户界面也是以赋值树的形式出现。
(C)变量域数据集合的输入及存储:变量域具有集合特性,分为两类:区间和集合。区间主要是针对数值型数据,通常包括左边界及右边界的边界属性,还包括是否包含边界的特征,除此之外,还有一类特殊的区间,该区间并非包括区间内的所有的值,而是按步长取值。集合是一个更为抽象的概念,集合中即可以由一个或多个简单数值组成,也可以多个区间及多个简单值组成。在输入界面中,输入集合数据并存储,实现变量域数据集合的录入及存储;
(D)对软件代码进行动态仿真,即在静态状态下以仿真的方式模拟软件的动态执行,记录动态仿真结果;
(E)如动态仿真结果有解,则本次检测结束;如动态仿真结果无解,则判断存在运行态约束不可达路径,转入(F);
(F)记录运行态约束不可达路径。
本发明还提供了一种软件代码不可达路径自动检测装置,包括:
源代码文件管理模块,用于导入被检测C语言代码文件,并对其进行增加、删除、修改等操作;
源代码处理模块,用于自动对软件代码进行处理,提取所需的代码元数据,构建函数调用关系图和控制流图;
不可达路径检测模块,用于依据所提基于函数调用和控制流、符号执行和约束求解、动态仿真四类不可达路径检测方法对源代码执行不可达路径检测;
检测结果管理模块,用于提供不可达路径检测结果的图形用户界面显示和文件输出;
回归检测模块,用于对修改后的代码进行回归检测。
本实施例中,源代码文件管理模块:可以导入被检测对象,可以为单独的C语言文件也可以为工程形式的多个C语言文件方式导入。导入后对检测对象可以通过增加、删除、修改等操作进行管理维护。
本实施例中,源代码处理模块:当被检测对象导入本装置后,将自动对软件代码基于语法词法语义分析进行预处理和格式化,提取所需的代码元数据。基于函数调用关系图和控制流图的概念构建函数调用关系图和控制流图,并提供用户界面查看源代码、函数调用关系图和控制流图。
本实施例中,不可达路径检测模块包括基于控制流图的不可达路径检测子模块、基于函数调用的不可达路径检测子模块、基于符号执行和约束求解的不可达路径检测子模块以及基于动态仿真的不可达路径检测子模块,能够自动检测软件代码中是否存在跳转不可达路径、控制不可达路径、静态约束不可达路径和运行态约束不可达路径,检测过程中能显示检测进度,并保存检测结果。
本实施例中,检测结果管理模块,检测结果可以通过用户界面进行查看,即可查看结果汇总,也可查看某个C语言文件的某个函数的不可达路径情况,及具体对应的代码及行号,检测结果也可以以文件的形式输出。
本实施例中,回归检测模块:当被检测对象修改后,可重新导入装置,进行回归检测,直到不可达路径的结果满足要求为止。
本发明提出的静态分析和动态仿真相结合的不可达路径自动检测技术,可以更全面更正确地检测不可达路径。静态分析检测法可以检测跳转不可达、控制不可达和静态约束不可达路径;动态仿真检测法可以检测运行态约束不可达路径,从而降低检测结果的漏报率和误报率。本发明提出的数据集合的抽象模型构建方法,在对数据类型充分解析的基础之上,通过对不同数据类型操作方式的抽象,实现对C语言的任意类型数据集合以标准化格式存储,为数据交换以及深层次的应用打下了坚实的基础,能极大地提高基于动态仿真不可达检测的可行性和实用性。本发明研制的代码不可达路径检测装置,能对被导入检测的C语言代码开展自动不可达路径检测,以图形用户界面显示检测结果,能提高不可达路径检测效率。
图2描述了基于静态分析与动态仿真相结合的软件代码不可达路径自动检测方法的总体技术方案,划分了三个层次:
a)代码处理层
代码处理层又可细分代码解析器、函数调用关系图构建和函数控制流图生成三个部分。
代码解析器部分类似实现编程语言编译器的功能实现,负责对代码进行语法分析、词法分析和语义分析,提取代码中语句、语句类型、表达式、变量、关键字等信息,并把代码信息存储于基础结果数据文件中。
函数调用关系图构建部分负责提取函数摘要信息,并构建函数调用关系图。函数摘要可以理解为函数具体功能的一个抽象。根据抽象解释理论,通过函数摘要来抽象一个函数调用的上下文信息和约束。
函数控制流图生成部分负责提取某个函数内基本块、块间关联关系、数据等信息,并把流信息存储于基础结果数据文件中,并生成函数内控制流图。
b)不可达路径检测层
这一部分主要在不可达路径类型识别和代码处理基础上,根据不同的不可达路径类型采用不同的检测方法,检查出代码中的不可达路径。通过代码词法语法语义分析基础上构建的控制流图检测出跳转不可达路径;通过函数调用关系图检查出控制不可达路径;通过符号执行和约束求解检测出静态约束不可达路径;通过动态仿真检测出运行态约束不可达路径。
c)结果报告层
通过用户界面和文件的形式输出检测出的不可达路径结果。
图3描述了图2中代码处理层的具体技术方案。代码解析器、函数调用关系图构建和函数控制流图生成,其中代码解析器是基础,分为三个步骤:代码预处理、代码格式化、元数据提取。
(1)代码预处理。主要对源代码的内容进行整理,得到完整、直观且语义清晰的预处理后文件。例如对于用C语言编写的源码,需要进行宏替换、预编译语句解析以及包含文件处理等。
(2)代码格式化。通常情况下,具体进行代码扫描时一行代码最多允许包含一条语句或者一个语义单位,而被分析的源代码不一定满足此要求,因此需要对预处理后的文件按照统一的标准进行格式化处理。格式化的同时记录下必要的格式化信息,包括源文件与格式化文件的行号对照表、格式变动信息等内容。格式化完成后,在对格式化后的文件进行代码解析。
(3)元数据提取。对格式化后的源代码文件进行解析,从中准确的提取出变量、关键词、函数调用、变量使用等信息,所有这些信息构成了代码元数据集合。
无论是代码预处理、格式化还是元数据提取都是以词法分析、语法分析及语义分析为基础进行的。基本过程是首先构建代码流,然后以编程语言的词法语法语义为基础,逐条解析代码流中的语句,在解析过程中以及代码流到达终点后,根据需要存储相关数据。
在代码解析器中,对应函数主要获取函数摘要信息。函数摘要是对函数中所关注的信息的抽取,忽略函数中与分析问题无关的冗余信息。在此主要关注主调函数和被调函数之间的调用关系,从三方面考虑函数摘要信息的构成:函数名、传递的参数;被调用函数列表。将函数的摘要信息归纳为三元组的形式。
函数调用关系图在代码解析器基础上,基于函数调用图的定义,逐个分析函数中定义的所有代码,若存在函数调用的情况,确定其主调函数,然后在利用存储的函数摘要信息查找该函数对应的调用关系,从而构建函数调用关系图。
在代码解析器基础上,基于控制流的定义,获取所需的节点、边、入口基本块、出口基本块等控制流所需信息,并对获取的信息进行存储,从而生成控制流图。
图4描述了图2中不可达路径检测层的基于符号执行和约束求解的不可达路径自动检测技术方案,包括三个方面:分支约束信息获取、分支约束求解和不可达路径结果记录。
第一方面:分支约束获取
利用符号执行技术的思想来获取分支约束。符号执行技术的核心思想是将具体输入变量使用符号来替换,程序中的变量由符号运算表示,符号和运算符组成符号运算式。符号执行中某条路径执行的过程实际上是搜索由一系列约束合取构成的路径条件,某个程序的所有路径能够组成一颗执行树。
基于符号执行的分支约束获取就是针对每条程序路径的每个节点中的基础程序语句都转换并更新成符号表示,包括赋值语句、条件语句、循环语句、函数调用等语句,这样就可以获取条件语句和循环语句中的约束条件的符号表示,即为分支约束。其获取流程如下:
(1)深度优先遍历函数控制流图并生成函数的执行路径集合。特别是遇到循环结构的控制流时,需明确循环次数,一般情况下,是无法展开全部循环的,同时记录每条执行路径的节点,注明节点是否为分支节点;
(2)利用符号执行获取每条执行路径上每个节点的符号表示。符号一般为函数的形参和全局变量;
(3)提取分支节点的分支约束信息,含变量、变量域及约束条件集。
第二方面:分支约束求解
分支约束一般可细分为布尔约束、数值约束和混合约束问题,不同约束问题虽然其求解的方法也不尽相同,但可以采用同溯法进行求解。该方法先为约束问题中的部分变量赋值,在这个部分赋值的基础上为其余的变量赋值。如果在这个部分赋值的基础上,下一个待赋值的变量找不到使得约束成立的解,则需要改变这个部分赋值中所赋的值。回溯法中的两个关键操作一是选取下一个待赋值的变量及其值,二是在发现有约束不成立时回溯。其求解流程如下:
(4)针对每条执行路径,依次按顺序遍历每个分支节点。
(5)针对每个分支节点,使用SMT算法对分支节点的约束条件进行求解,利用Z3开源约束求解器进行约束求解。
(6)根据分支约束问题的求解结果进行不同的处理:一是若结果有解,继续遍历该执行路径的下一个分支节点直到所有路径所有分支均已求解完毕;二是若结果无法判断,继续采用基于动态仿真的不可达路径检测方法;三是若结果无解,则可判断存在静态约束不可达路径,转入第三步不可达路径结果记录。
第三方面:不可达路径结果记录
当发现某条执行路径中的某个分支约束无解时,先获取该分支的起始行,同时通过控制流获取该分支的顺序执行的结束行,从开始行到结束行的路径即为不可达路径,并记录在不可达路径集合中。
图5描述了数据抽象模型构建流程,是基于动态仿真的不可达路径检测流程中最关键流程之一,解决被检测函数对应的输入变量取值范围的录入问题,其构建流程如下:
(1)如果复合变量类型是指针,需要得到其指向的数据类型。将指针型变量的数据处理方式抽象化为四类:过渡到指向数据、对指向数据赋值、指针直接赋值以及处理为数组。其中“过渡到指向数据”和“处理为数组”这两种处理方式都将会自动创建新的子节点,新节点的数据类型会随之变化。继续对新的节点处理直到处理完毕。“指向数据复值”会直接给指针所指向的数据赋值。“指针直接赋值”将当前指针指向另外一个指针或数组。
(2)如果复合变量类型是数组,提供两种处理方式:抽象赋值以及数组元素赋值。抽象赋值是指将数组指向另外一个数组或者指针,数组元素赋值是指按顺序逐个添加数组元素。如果数组的大小在声明时没有确定,需要在添加数组元素前确定数组大小的具体值。
(3)如果复合变量类型是基础类型,如是简单数据类型,则直接录入值;如是复合类型,则根据基础类型定义,提取出基础类型所包含的子属性,并自动为每个子属性创建以当前节点为母节点的子节点,继而分别处理每个子节点,直到所有数据输入完毕,按照定义的数据存储格式存储数据即可。
图6描述了变量域数据集合的存取流程,也是基于动态仿真的不可达路径检测流程中最关键流程之一,解决执行路径中各节点变量的即时、准确的存取问题。各节点变量分为地址类型变量和非地址类型变量,其处理流程如下:
(1)地址类型变量即时存取
地址变量的操作同普通的变量操作有很大的区别,本发明提出利用仿真地址空间对地址变量的操作数进行存储。
地址变量的操作主要包括创建、指向、赋值、取值、状态调整等操作。地址创建是指创建一个新地址。指向是指将一个变量指向某个地址。赋值是指将某数值存储到特定地址的具体偏移处。状态调整是指设置地址当前的状态,如正常、注销等。如果存在地址创建操作,则向地址集合中添加一个地址数据,具体要包括地址创建的位置、操作数、自动生成的地址号等信息。如果涉及到地址指向操作,则将变量的变量号、操作数、位置、偏移量等信息记录到当前地址对应的地址变量集合中,如果是给特定地址某偏移处存值,则将该值存储到地址值集合中。特殊的,如果值是一个地址的话,需要在地址的值中存储指向的具体地址。
(2)非地址类型变量即时存取
基于作用域的不同,非地址类型变量又分为静态变量以及局部变量,其中静态变量既包括静态局部变量,又包括静态及非静态全局变量。在路径遍历过程中,如果遇到非地址类型变量操作,首先要根据操作数的位置及名称确认变量,如果是存储操作,则将该变量所对应的值存入变量数据集合,如果是提取操作,则根据变量的名称及位置从变量数据集合中提取对应的数据。
软件代码的不可达路径自动检测的装置主界面,包括以下几个方面:
(1)主菜单,提供了文件、查看、基本信息、限定条件、工具、设置、帮助等菜单栏。
(2)工具栏,提供了该装置某些主要功能的快捷启动方式,当鼠标停留在每一个工具栏的小图标上时,都有相应的说明,方便用户使用。
(3)函数(过程)导航窗口,以树形结构按层次显示文件和函数等信息。用户可以在此列表中选择要检测的函数。如果当前处 理的是工程,则根节点是工程名称,根节点下层是文件节点,文件节点下层是函数节点。如果当前处理的是文件,则根节点显示的文件名称,下层是函数节点。
(4)检测结果显示窗口,分类显示当前被测对象中的不可达路径的检测结果。
(5)代码窗口,显示被测函数的代码及不可达路径的对应的代码。以不同的颜色显著显示不同类型的不可达路径。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (7)
1.一种软件代码不可达路径自动检测的方法,其特征在于,包括:
步骤(1),开展软件代码不可达路径类型的识别和分析;将软件代码不可达路径类型划分四类:跳转不可达、控制不可达、静态约束不可达和运行态约束不可达;
步骤(2),输入软件代码,对软件代码进行处理;基于词法语法语义分析进行代码解析,提取代码元数据,生成函数调用关系图和控制流图;
步骤(3),基于步骤(2)生成的控制流图,针对跳转不可达路径,开展基于控制流的不可达路径自动检测;
步骤(4),基于步骤(2)生成的函数调用关系图,针对控制不可达路径,开展基于函数调用的不可达路径自动检测;
步骤(5),基于步骤(2)的结果,针对静态约束不可达,开展基于符号执行和约束求解的不可达路径自动检测;
步骤(6),基于步骤(2)的结果,针对运行态约束不可达,开展基于动态仿真的不可达路径自动检测;
步骤(7),保存检测结果;在步骤(3)~步骤(6)中如检测到相匹配的不可达路径,则记录到结果文件中,包括不可达路径所在函数名、开始行号、结束行号以及不可达路径类型;
开展基于动态仿真的运行态约束不可达路径自动检测,包括如下步骤:
(A)变量类型解析:将分支节点的约束变量分为简单变量类型和复合变量类型,编程语言语法所定义的基本数据类型为简单变量类型;其余为复合变量类型;
(B)数据抽象模型构建:对于复合变量类型,不能通过输入一个数据值实现变量数据的输入及存储,需要根据具体的变量类型逐层分析以构建数据抽象模型,以“树”的形式存储变量数据;
(C)变量域数据集合的输入及存储:变量域具有集合特性,分为两类:区间和集合;在输入界面中,输入集合数据并存储,实现变量域数据集合的录入及存储;
(D)对软件代码进行动态仿真,在静态状态下以仿真的方式模拟软件的动态执行,记录动态仿真结果;
(E)如动态仿真结果有解,则本次检测结束;如动态仿真结果无解,则判断存在运行态约束不可达路径,转入(F);
(F)记录运行态约束不可达路径。
2.根据权利要求1所述的一种软件代码不可达路径自动检测的方法,其特征在于,跳转不可达路径为:使用了包括return, break, exit, goto的跳转语句,并且这些跳转语句不是顺序执行的一组语句的最后一条语句,导致从使用跳转语句的下一行直到这组顺序执行的一组语句的最后一行组成的路径成为跳转不可达路径;
控制不可达路径为:某个函数不被任何其他函数调用,即无法同其它代码相关联的代码块,成为孤岛函数,导致这个函数内部的所有路径均为控制不可达路径;
跳转和控制不可达路径由代码的语句构成决定的,由不当的设计导致的,同数据无关。
3.根据权利要求1所述的一种软件代码不可达路径自动检测的方法,其特征在于,静态约束不可达路径和运行态约束不可达路径,均属于约束不可达路径,因程序结构中存在条件结构和循环结构,使得程序控制图中存在分支节点;分支节点至少存在两条路径分支:一条为取值为真的路径分支;另一条是取值为假的路径分支;当分支条件不满足时,即分支约束问题无解,导致不满足的那条分支成为约束不可达路径;
不考虑被检查对象在实际运行过程中的数据约束条件,而是将输入数据抽象为可取任意值,将这种检测称为静态约束不可达检测;
如考虑输入被检对象在运行过程中的数据约束条件则这种检测称为运行态约束不可达检测。
4.根据权利要求1所述的一种软件代码不可达路径自动检测的方法,其特征在于,软件代码的处理包括以下步骤:
Ⅰ代码预处理:主要对源代码的内容进行整理,得到完整、直观且语义清晰的预处理后文件;
Ⅱ代码格式化:进行代码扫描时一行代码最多允许包含一条语句或者一个语义单位,而被分析的源代码不一定满足此要求,需要对预处理后的文件按照统一的标准进行格式化处理;格式化的同时记录下必要的格式化信息,包括源文件与格式化文件的行号对照表、格式变动信息的内容;格式化完成后,在对格式化后的文件进行代码解析;
Ⅲ元数据提取:对格式化后的源代码文件进行解析,从中准确的提取出变量、关键词、函数调用以及变量使用的信息,所有这些信息构成了代码元数据集合;
Ⅳ函数调用关系图构建:基于函数调用图的定义,逐个分析函数中定义的所有代码,若存在函数调用的情况,确定其主调函数,然后在利用存储的函数摘要信息查找该函数对应的调用关系,从而构建函数调用关系图;
Ⅴ控制流图生成:基于控制流的定义,获取所需的节点、边、入口基本块以及出口基本块的控制流所需信息,并对获取的信息进行存储,从而生成控制流图。
5.根据权利要求1所述的一种软件代码不可达路径自动检测的方法,其特征在于,开展基于控制流的不可达路径自动检测的方法为:基于控制流分析通过检测跳转关键词后面的语句是否与跳转关键词属于同一基本块来判断其是否存在跳转不可达路径。
6.根据权利要求1所述的一种软件代码不可达路径自动检测的方法,其特征在于,开展基于函数调用的不可达路径自动检测的方法为:结合函数调用关系分析是否存在孤岛函数来判断是否存在控制不可达路径。
7.根据权利要求1所述的一种软件代码不可达路径自动检测的方法,其特征在于,开展基于符号执行和约束求解的不可达路径自动检测,包括如下步骤:
①深度优先遍历函数控制流图并生成函数的执行路径集合;
②利用符号执行获取每条执行路径上每个节点的符号表示;
③提取分支节点的分支约束信息,含变量、变量域及约束条件集;
④针对每条执行路径中每个分支节点,使用可满足性模理论SMT算法对分支节点的约束条件进行求解;
⑤如分支节点的约束问题有解,则重复③~④直到所有路径所有分支均已求解完毕;如分支节点的约束问题无解,则判断存在静态约束不可达路径,转入⑥;如分支节点的约束问题无法判断,则利用动态仿真的方法进行检测;
⑥记录静态约束不可达路径。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210888454.1A CN115080448B (zh) | 2022-07-27 | 2022-07-27 | 一种软件代码不可达路径自动检测的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210888454.1A CN115080448B (zh) | 2022-07-27 | 2022-07-27 | 一种软件代码不可达路径自动检测的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115080448A CN115080448A (zh) | 2022-09-20 |
CN115080448B true CN115080448B (zh) | 2023-03-17 |
Family
ID=83242052
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210888454.1A Active CN115080448B (zh) | 2022-07-27 | 2022-07-27 | 一种软件代码不可达路径自动检测的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115080448B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117407876A (zh) * | 2023-12-11 | 2024-01-16 | 常熟理工学院 | 恶意软件中的不透明谓词检测方法、***及存储介质 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104794401B (zh) * | 2015-04-15 | 2018-01-16 | 南京大学 | 一种静态分析辅助的符号执行漏洞检测方法 |
CN105243018B (zh) * | 2015-10-24 | 2017-11-24 | 北京航空航天大学 | 一种面向对象的类测试数据生成方法 |
CN105446881A (zh) * | 2015-11-26 | 2016-03-30 | 福建工程学院 | 一种程序不可达路径的自动检测方法 |
CN112380120B (zh) * | 2020-11-13 | 2022-06-10 | 华南理工大学 | 单元测试代码结构自动解析与路径分析方法 |
-
2022
- 2022-07-27 CN CN202210888454.1A patent/CN115080448B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN115080448A (zh) | 2022-09-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
AU2010350247B2 (en) | Code inspection executing system for performing a code inspection of ABAP source codes | |
CN111459799B (zh) | 一种基于Github的软件缺陷检测模型建立、检测方法及*** | |
Baldi et al. | A theory of aspects as latent topics | |
US6941546B2 (en) | Method and apparatus for testing a software component using an abstraction matrix | |
US8132156B2 (en) | Methods and systems for testing tool with comparative testing | |
Androutsopoulos et al. | State-based model slicing: A survey | |
CN106294156A (zh) | 一种静态代码缺陷检测分析方法及装置 | |
US20020100022A1 (en) | Method and apparatus for automatic verification of properties of a concurrent software system | |
Sarhan et al. | A survey of challenges in spectrum-based software fault localization | |
US20140013297A1 (en) | Query-Based Software System Design Representation | |
Zhu et al. | A systematic literature review of how mutation testing supports quality assurance processes | |
US7958073B2 (en) | Software and methods for task method knowledge hierarchies | |
CN115080448B (zh) | 一种软件代码不可达路径自动检测的方法和装置 | |
Arya et al. | Information correspondence between types of documentation for APIs | |
Liuying et al. | Test selection from UML statecharts | |
Mao et al. | User behavior pattern mining and reuse across similar Android apps | |
CN115454702A (zh) | 日志故障分析方法、装置、存储介质及电子设备 | |
Tatale et al. | A Survey on Test Case Generation using UML Diagrams and Feasibility Study to Generate Combinatorial Logic Oriented Test Cases. | |
Tukaram | Design and development of software tool for code clone search, detection, and analysis | |
CN113805861A (zh) | 基于机器学习的代码生成方法、代码编辑***及存储介质 | |
Duarte et al. | Extraction of probabilistic behaviour models based on contexts | |
Mehrpour et al. | Programming tools for working with design decisions in code | |
Zhang et al. | ReInstancer: An automatic refactoring approach for Instanceof pattern matching | |
Saddler | EventFlowSlicer: A Goal-based Test Case Generation Strategy for Graphical User Interfaces | |
KR101974804B1 (ko) | 플로우 다이어그램 생성 방법 및 이를 실행하는 장치 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |