CN114661588A - 代码执行覆盖率统计的方法、装置及计算设备 - Google Patents
代码执行覆盖率统计的方法、装置及计算设备 Download PDFInfo
- Publication number
- CN114661588A CN114661588A CN202210245230.9A CN202210245230A CN114661588A CN 114661588 A CN114661588 A CN 114661588A CN 202210245230 A CN202210245230 A CN 202210245230A CN 114661588 A CN114661588 A CN 114661588A
- Authority
- CN
- China
- Prior art keywords
- code
- information
- instruction
- source 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 58
- 238000003860 storage Methods 0.000 claims abstract description 18
- 230000006870 function Effects 0.000 claims description 165
- 238000012545 processing Methods 0.000 claims description 7
- 238000012986 modification Methods 0.000 abstract description 7
- 230000004048 modification Effects 0.000 abstract description 7
- 238000003780 insertion Methods 0.000 abstract description 6
- 230000037431 insertion Effects 0.000 abstract description 5
- 238000004088 simulation Methods 0.000 description 20
- 238000004458 analytical method Methods 0.000 description 19
- 238000005516 engineering process Methods 0.000 description 19
- 230000008569 process Effects 0.000 description 8
- 238000010586 diagram Methods 0.000 description 7
- 238000012795 verification Methods 0.000 description 7
- 238000004364 calculation method Methods 0.000 description 6
- 238000012360 testing method Methods 0.000 description 5
- 239000000284 extract Substances 0.000 description 4
- 238000007405 data analysis Methods 0.000 description 3
- 238000005457 optimization Methods 0.000 description 3
- 239000002699 waste material Substances 0.000 description 3
- 238000013461 design Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 238000007619 statistical method Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
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/3668—Software testing
- G06F11/3672—Test management
- G06F11/3676—Test management for coverage analysis
-
- 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/3664—Environments for testing or debugging software
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Debugging And Monitoring (AREA)
Abstract
一种代码执行覆盖率统计的方法包括:根据目标码函数指令信息、目标码函数分支指令信息和目标码指令对应源码信息来计算目标码覆盖率。将源代码抽象为语法树,解析该语法树得到源码函数信息。解析源码函数信息,从中得到源码函数行号信息和源码函数分支行号信息。根据目标码指令对应源码信息、源码函数行号信息和源码函数分支行号信息来计算源码覆盖率。本发明实现了一种无需插桩代码就能统计覆盖率的方法和装置,能有效避免软件生产工艺中插桩码冗余导致软件漏洞、生成的目标码文件的存储体积增大、以及插桩导致源代码修改频繁的问题,从而提高软件产品的稳定性和可靠性。
Description
技术领域
本发明涉及嵌入式领域,尤其涉及嵌入式系统的代码覆盖率统计问题。
背景技术
随着武器装备的复杂度的大幅度增加,运行在装备上的嵌入式系统也越来越复杂,功能迭代越来越多,代码中就可能就会存在部分无用代码,或者在执行过程中无法测试覆盖的分支,从而给软件带来很大的漏洞,严重降低软件的可靠性。因此,需要构建一个能够动态分析代码执行覆盖情况的装置或方法,来检测筛别执行和未执行代码,进行执行代码的覆盖率统计。
通过覆盖率统计分析,得出嵌入式软件执行覆盖情况,查看软件中有哪函数未执行,函数中哪些分支未执行,然后分析软件中函数或分支没有执行的原因,调整测试方法使尽可能多的函数和函数分支得到测试,从而大大提升软件的可靠性。
目前大部分覆盖率统计技术都是通过在源代码中插桩的方式来进行统计覆盖率情况,就是在函数入口,分支语句等地方写入特定标志语句,执行后统计标志信息,来计算覆盖率情况,但是这样做会带来很多的问题,如:需要修改源代码,目标码文件增大等问题。一方面增加了人工成本,另一方面由于目标码过大导致无法下载到目标板等一系列问题。
因此,亟需设计一种无需插桩代码就能统计覆盖率的方法和装置来解决上述问题:该方法和装置能避免软件生产工艺中,插桩码冗余导致软件漏洞,生成的目标码文件的存储体积增大,以及插桩导致源代码修改频繁等问题,从而提高软件产品的稳定性和可靠性。
发明内容
本发明之目的在于提供一种代码执行覆盖率统计的方法,实现了一种无需插桩代码就能统计覆盖率的方法和装置,能有效避免软件生产工艺中插桩码冗余导致软件漏洞、生成的目标码文件的存储体积增大、以及插桩导致源代码修改频繁的问题,从而提高软件产品的稳定性和可靠性。
为实现上述目的,本发明提供了一种代码执行覆盖率统计的方法,方法包括:解析目标码的函数信息,从中得到目标码函数指令信息、目标码函数分支指令信息、目标码指令对应源码信息。目标码指令对应源码信息包括函数总语句数和函数内具有对应关系的行号数。根据目标码函数指令信息、目标码函数分支指令信息和目标码指令对应源码信息来计算目标码覆盖率。将源代码抽象为语法树,解析该语法树得到源码函数信息。解析源码函数信息,从中得到源码函数行号信息和源码函数分支行号信息。根据目标码指令对应源码信息、源码函数行号信息和源码函数分支行号信息来计算源码覆盖率。
作为优选方式,解析目标码的函数信息具体包括:处理反汇编文件信息,提取反汇编文件的指令行号与指令地址的对应信息。根据反汇编文件的指令行号得到与该指令行号对应的源代码中的指令行号。根据源代码中的指令行号动态执行的指令地址得到源代码的指令执行行号的指令地址。
作为优选方式,处理反汇编文件信息,提取反汇编文件的行号与指令地址对应信息包括:解析反汇编文件获取所有的函数指令地址信息和跳转指令信息。
作为优选方式,获取跳转信息包括:获取跳转指令的地址,来确定这个跳转指令是否被执行。获取跳转的地址,来确定是否进入True分支。获取跳转指令的下一条地址,来确定是否执行False分支。
作为优选方式,解析源码函数信息,从中得到源码函数行号信息和源码函数分支行号信息包括:获取到抽象语法树后提取语法数中代码块的行号。根据代码块的类型来判断代码是否执行,且记录指令执行行号以及该指令执行行号对应的指令地址。代码块的类型包括for代码块、if代码块、else代码块、while代码块、switch代码块、case代码块、default代码块。若代码块的类型为for代码块或while代码块时,如果执行了该分支起始行则判断执行了该分支的False分支,记录False分支相关的指令信息。如果执行了分支块内的代码则判断为执行了该分支的True分支,记录True分支相关的指令信息。
作为优选方式,通过以下公式计算所需目标码覆盖率。目标码覆盖率包括目标码总语句覆盖率、目标码总分支覆盖率、目标码函数语句覆盖率和/或目标码单个函数分支覆盖率,其中,
作为优选方式,通过以下公式计算所需源代码覆盖率。源代码覆盖率包括源代码总语句覆盖率、源代码总分支覆盖率、源代码函数语句覆盖率和/或源代码单个函数分支覆盖率,其中,
作为优选方式,本发明提供了一种代码执行覆盖率统计的装置包括:目标码覆盖率统计模块,用于解析目标码的函数信息,从中得到目标码函数指令信息、目标码函数分支指令信息、目标码指令对应源码信息。以及用于根据目标码函数指令信息、目标码函数分支指令信息和目标码指令对应源码信息来计算目标码覆盖率。目标码指令对应源码信息包括函数总语句数和函数内具有对应关系的行号数。源代码覆盖率统计模块,用于将源代码抽象为语法树,解析该语法树得到源码函数信息。解析源码函数信息,从中得到源码函数行号信息和源码函数分支行号信息。根据目标码指令对应源码信息、源码函数行号信息和源码函数分支行号信息来计算源码覆盖率。
作为优选方式,本发明提供了一种计算设备,包括:一个或多个处理器,存储器,一个或多个程序。一个或多个程序存储在存储器中并被配置为由一个或多个处理器执行,一个或多个程序包括用于执行根据本发明的代码执行覆盖率统计方法的指令。
作为优选方式,本发明提供了一种存储一个或多个程序的计算机可读存储介质,一个或多个程序包括指令,该指令当由计算设备执行时,使得计算设备执行根据本发明的代码执行覆盖率统计方法中的方法。
本发明实现了一种无需插桩代码就能统计覆盖率的方法和装置,能有效避免软件生产工艺中插桩码冗余导致软件漏洞、生成的目标码文件的存储体积增大导致无法下载到目标板、以及插桩导致源代码修改频繁的问题,从而提高软件产品的稳定性和可靠性,减少生产软件产品的人工成本。
附图说明
图1为本发明的代码执行覆盖率统计的第一流程示意图。
图2为本发明的代码执行覆盖率统计的执行指令地址存储示意图。
图3为本发明的反汇编文件存储格式示意图。
图4为本发明的传感控制器编程工装的仰视图。
图5为本发明的代码执行覆盖率统计的第二流程示意图。
图6为本发明的代码执行覆盖率统计的第三流程示意图。
图7为本发明的反汇编文件指令格式解析示意图。
图8为GNU编译工具链输入输出示意图。
图9仿真平台能够统计运行过的汇编指令示意图。
图10反汇编文件指令信息存储格式示意图。
具体实施方式
在下文中,将参照附图描述本发明的代码执行覆盖率统计的方法、装置、计算设备及存储介质的实施方式。
在此记载的实施方式为本发明的特定的具体实施方式,用于说明本发明的构思,均是解释性和示例性的,不应解释为对本发明实施方式及本发明范围的限制。除在此记载的实施方式外,本领域技术人员还能够基于本申请权利要求书和说明书所公开的内容采用显而易见的其它技术方案,这些技术方案包括对在此记载的实施方式做出任何显而易见的替换和修改之技术方案。
实施例一
零插桩技术需要分析嵌入式软件的目标码及源代码,通过提取目标码及源代码中的特征信息,获取函数信息,及函数中的分支信息等。根据函数信息,及函数中的分支信息来计算相应的覆盖率。本发明统计覆盖率包括:统计嵌入式软件的指令覆盖率、指令函数覆盖率、指令函数分支覆盖率、源代码行覆盖率、源代码函数覆盖率、源代码函数分支覆盖率。
处理反汇编文件信息,行号信息与指令信息对应关系是固定的,都基本满足如图6的格式:包含指令地址4、函数起始地址5、函数名词6和指令信息7。指令地址4由4位或8位数字和字母组成的十六进制数,不够位数用0或空格补充。函数起始地址5由8位数字和字母组成的十六进制数,不够位数用0补充。提取文件行号与指令地址对应信息,计算时如反汇编相应行号的某一条指令被执行那么对应源代码的这一行也就被执行了,但是在反汇编信息中只有产生指令操作的反汇编代码对应的源代码才被认为是有效行,所以本发明中也只统计产生指令操作的反汇编代码对应的源代码的行号作为有效行,进行覆盖率计算。
如图2所示,在仿真环境中,运行嵌入式软件就是将嵌入式软件编译好的二进制文件解析成对应的汇编指令写入仿真硬件环境中,然后一条条执行指令,模拟出嵌入式软件在真实环境中的运行效果。在运行过程中将执行的每条指令地址记录下来就可以得到执行信息。
如图2所示,记录指令执行信息通过创建一个记录设备来完成记录工作,每次处理器执行一条指令时将地址信息传给记录设备由记录设备存储执行地址信息。在记录设备中,会根据收到的地址信息创建相应的地址表来记录执行情况,当收到地址信息后检索当前地址表是否有该地址如果没有将创建一块地址空间映射该地址,如果有该地址的地址表,将会在该地址表对应位置做+1操作。在需要执行信息的时候将检索所有的地址表,将所有非0的地址输出到文件中,达到记录指令流的效果。
更进一步地,本发明提供了一种代码执行覆盖率统计的方法,方法包括:
如图1所示,一方面,代码执行覆盖率统计的方法包括目标码执行覆盖率统计的方法,该方法可以包括如下步骤:
步骤101,解析目标码的函数信息,从中得到目标码函数指令信息、目标码函数分支指令信息、目标码指令对应源码信息。目标码指令对应源码信息包括函数总语句数和函数内具有对应关系的行号数。
步骤102,根据目标码函数指令信息、目标码函数分支指令信息和目标码指令对应源码信息来计算目标码覆盖率。
在步骤101中,系统反汇编工具使用的是现成的GNU编译工具链,编译工具链已经支持对程序编译、反汇编、提取一些符号信息的功能,更加具体的例如工具链中包含一个objdump.exe的工具,使用-D-S-l参数,以某个程序作为输入,输出便是一串带有符号信息的,如图8所示。命令为“objdump.exe-S-C-l test_c6713.out>test.s”,得到一个test.s的输出文件。
步骤101中,参考图9,解析反汇编文件获取所有的函数指令地址信息,该过程包括从反汇编文件提取目标码的函数信息。例如,系统解析到文件路径、文件名和对应代码行号:如第七行的函数在内存中的地址、函数名。第九行包含函数所在的源文件路径、对应的文件名、以及指令对应的代码行号。第十二至十四行的程序实际在仿真平台中运行的汇编指令。在反汇编指令中程序解析到八位数字就能得到指令地址例如:10800004这个指令地址。仿真平台能够统计得到的关键信息就是运行过的汇编指令,根据汇编指令反推出源码的执行情况。
步骤102中,通过以下公式计算所需目标码覆盖率。目标码覆盖率包括目标码总语句覆盖率、目标码总分支覆盖率、目标码函数语句覆盖率和/或目标码单个函数分支覆盖率,其中,
另一方面,如图1所示,代码执行覆盖率统计的方法还包括源代码执行覆盖率统计的方法,该方法包括如下步骤:
步骤201,将源代码抽象为语法树,解析该语法树得到源码函数信息。
步骤202,解析源码函数信息,从中得到源码函数行号信息和源码函数分支行号信息。
步骤203,根据目标码指令对应源码信息、源码函数行号信息和源码函数分支行号信息来计算源码覆盖率。
步骤201中,源代码的分支信息需要通过分析源代码文件获得准确的分支信息,本发明中采用clang工具提取源代码文件的抽象语法树,通过抽象语法树获取源代码的分支信息,获取到抽象语法树后提取语法数中关于for、if...else、while、switch...case...default等代码块的行号。大致可以包括以下三步:首先clang工具解析源代码分支语句(抽象语法树),其次返回分支信息,最后获取分支语句行号。
具体而言,解析源代码分支语句也就是使用clang工具将源代码转换为抽象语法树。抽象语法树会将源代码抽象为树形结构,该树形结构包括每种源代码关键字如for、while、if等的对应标识,提取并解析相应标识得到该行是何种类型语句,以及根据相应类型来统计语句块的起止行号等信息,以及提取所有源代码中关于分支的行号,以及其语句块起止行号信息。行号即为代码语句在源代码文件中的第几行,分支行号即为分支的行号。
步骤202中,解析源码函数信息,从中得到源码函数行号信息和源码函数分支行号信息包括:获取到抽象语法树后提取语法数中代码块的行号。根据代码块的类型来判断代码是否执行,且记录指令执行行号以及该指令执行行号对应的指令地址。代码块的类型包括for代码块、if代码块、else代码块、while代码块、switch代码块、case代码块、default代码块。若代码块的类型为for代码块或while代码块时,如果执行了该分支起始行则判断执行了该分支的False分支,记录False分支相关的指令信息。如果执行了分支块内的代码则判断为执行了该分支的True分支,记录True分支相关的指令信息。
具体而言,解析过程中还需要获取跳转指令信息:跳转信息获取需要获取三个地址,跳转指令的地址,来确定这个跳转指令是否被执行,跳转的地址,来确定是否进入True分支,跳转指令的下一条地址,来确定是否执行False分支。每种架构的指令格式都不尽相同所以本发明按分支类型来分别单独统计跳转信息的上述三个地址,从而统计相应的执行分支数。
步骤203中,通过以下公式计算所需源代码覆盖率。源代码覆盖率包括源代码总语句覆盖率、源代码总分支覆盖率、源代码函数语句覆盖率和/或源代码单个函数分支覆盖率,其中,
参考图4,通过以下手段来解析目标码的函数总语句数和函数内目标码与源码对应行号数从而计算源码覆盖率:
1、解析目标码文件,将其转换为反汇编文件,转换时添加相应参数,将参数存储在反汇编文件中:例如参数可以包括获取指令所对应的源代码行号等。具体而言,如图3所示,在反汇编文件中所有指令、函数名称、源代码行号都有固定格式,包含源码文件名称1、源码文件行号2及源码文件相应行数所对应的指令信息3。使用正则表达式处理反汇编文件,可以获得函数的指令信息,指令与行号的对应关系,总指令数等。若干条指令对应一个行号,如果这若干指令中有一条指令被执行,则表示该行号的源代码被执行。
2、根据仿真中获取的执行指令信息以及根据解析目标码文件的结果,来进行相应覆盖率的计算,得出最终结果。
在本发明中,覆盖率术语解释如下:
总语句数为反汇编文件中源代码文件所有对应关系的行号数量。已执行语句数为已执行指令对应行号数量。函数总语句数为反汇编文件中源代码文件函数内所有对应关系的行号数量。函数已执行语句数为函数内已执行指令对应行号数量。函数语句总分支数为函数内语句的分支总数。函数语句已执行分支数为函数内语句已执行的分支数量。总指令数为反汇编文件中指令总数。已执行指令数为反汇编文件中已执行的指令数。函数指令总数为反汇编文件中函数的指令总数。函数已执行指令数为反汇编文件中已执行的指令数。函数指令总分支数为反汇编文件中函数的分支指令总数。函数指令已执行分支数为反汇编文件中已执行的分支指令数。
步骤101中,解析目标码的函数信息具体包括:
以如下手段来处理反汇编文件信息,提取反汇编文件的指令行号与指令地址的对应信息:
1、统计执行过的分支数:解析反汇编文件获取所有的函数指令地址信息和跳转指令信息。具体而言,获取跳转信息包括:获取跳转指令的地址,来确定这个跳转指令是否被执行。获取跳转的地址,来确定是否进入True分支。获取跳转指令的下一条地址,来确定是否执行False分支。
2、统计执行语句数:需要指出的是,解析目标码的函数信息来计算目标码覆盖率的同时,同样地根据该信息来计算源码的覆盖率。具体而言,目标码指令与源代码存在对应关系——在目标码的反汇编中都是若干条指令对应某一行源代码的对应关系,这若干条指令有一条执行则表示对应的这一行源代码被执行了。因而,本发明从目标码的执行情况来计算目标码的覆盖率及源代码的覆盖率。
如图7所示,给出了一目标码的反汇编文件的示例,其中,main.c的第44行代码,对应的指令是3f822f地址的指令。计算覆盖率时,都是通过执行的地址计算目标码覆盖率情况:如main这个函数,地址是从3f822f到3f823d这个范围,执行的地址有这个区间内的则表示这个函数被执行了,使用区间内的执行地址个数与范围内地址总数计算即可计算出指令覆盖率。此外,通过图7的反汇编文件也可以提取出main函数在源代码文件中的行号范围是44到57行。由此可进一步地,得到产生指令操的行号,这也是main函数的语句总数。在该示例中,3f822f对应44行,3f8230、3f8231、3f8232对应着45行。通过提取指令行号和对应地址就可以根据指令的执行情况知道有哪些行被执行了,并将上述指令存储记录在内存中。
通过以上手段统计指令执行情况后,即可根据反汇编文件的指令行号得到与该指令行号对应的源代码中的指令行号。以及根据源代码中的指令行号动态执行的指令地址得到源代码的指令执行行号的指令地址。之后在计算覆盖率时,根据本发明的覆盖率求取步骤的相应公式即可得出相应覆盖率。例如本例中,可以统计所有地址行号从而得到目标码和源码的函数中已执行指令语句数。源码的函数中已执行指令语句数在与源码中相应的函数总指令语句数相除求百分比后,即可得出源码中相应的函数语句覆盖率。目标码的函数中已执行指令语句数在与目标码中相应的函数总指令语句数相除求百分比后,即可得出目标码中相应的函数语句覆盖率。
参考图10,在反汇编文件中符合指令格式的为指令信息,类似如下格式:地址、指令字、指令操作信息。分支指令信息,为指令操作为分支指令的执行信息。指令对应源码,在反汇编时使用特定参数,可以在反汇编文件中输出源代码行号信息,若干条指令对应一个行号。只要执行其中一条指令,则表示该行代码被执行。
参考图5,代码执行覆盖率统计的方法还包括:
步骤301:根据仿真中获取的执行指令信息具体为:与仿真验证工具配合获取执行PC地址信息,分析嵌入式软件的执行覆盖情况。与仿真验证工具配合获取执行PC地址信息是指获取代码执行的PC(Program Counter)地址信息。采用仿真验证工具对于没有执行过的PC和指令不进行统计。从而源代码和目标码的覆盖率仅仅分析执行指令覆盖情况。如上文步骤203中所述,本发明首先仿真手段例如仿真工具将覆盖率的相关参数从目标文件和源文件中提取出来并输出至覆盖率统计计算的模块,然后再通过上述目标码执行覆盖率统计的方法和源码执行覆盖率统计的方法来计算覆盖率。
具体而言,仿真验证工具为仿真平台。仿真平台中包含虚拟CPU模块,CPU能够解析程序的指令并执行这些指令。指令根据预设规则存放在PC地址中。每一条指令必定有一个PC地址,虚拟CPU通过记录程序实际运行过程中走过的PC地址,对比反汇编生成文件的PC得到一个最终结果。
获取动态执行的pc信息中,该信息包括执行指令的地址信息。举例说明,假设将目标码反汇编出来具有10个地址指令信息,这10个指令分别对应了源代码中的10行代码,动态执行了其中6个地址的指令,6个地址对应的源代码也执行了6行代码,则目标码指令覆盖率为60%,语句覆盖了为60%。在此过程中,动态执行的pc信息为覆盖率的计算提供了参数,参数例如执行指令数等。
综上所述,本发明提供的代码执行覆盖率统计的方法,实现了一种无需插桩代码就能统计覆盖率的方法和装置,能有效避免软件生产工艺中插桩码冗余导致软件漏洞、生成的目标码文件的存储体积增大导致无法下载到目标板、以及插桩导致源代码修改频繁的问题,从而提高软件产品的稳定性和可靠性,减少生产软件产品的人工成本。
具体而言,本发明首先能够解决覆盖率统计时,由于插桩代码来进行统计覆盖率情况导致的程序运行不可控甚至运行错误等一系列问题,插桩代码即现有技术中的和代码执行无关仅仅用以统计覆盖率的标志。其次,由于仿真内存可配且本发明无需于源代码中添加插桩来计算覆盖率,进而压缩了目标码体积,使目标码不受硬件内存过小的限制,因此本发明能够从根源解决插桩后导致的无法下载到目标板的问题。而更为重要的是,基于指令流记录的真实程序运行过程统计也比插桩软件算法统计出的结果更具有说服力:其一传统计算方式仅仅通过源码计算覆盖率还包括源代码冗余和插桩错误的问题,其二建立在反汇编统计数据上计算得到的源码覆盖率更为准确。
本发明较现有技术具备以下优点:
(1)实现了目标码和源码覆盖率统计的零插桩技术
零插桩统计覆盖率需要分析的是嵌入式软件的基本特性和执行特性。在不插桩的前提下,使用反汇编工具生成嵌入式软件目标码的反汇编文件,通过分析反汇编文件获取想要的基础信息,如函数指令信息,地址对应源码行号信息等。再与仿真验证工具配合获取执行PC地址信息,分析嵌入式软件的执行覆盖情况,实现零插桩分析覆盖率的目的。
(2)实现了支持多架构的嵌入式软件目标码分析技术,通过目标码文件来同时统计源码和目标码覆盖率,不仅仅稳定性、可靠性和准确率高,还能快速移植到不同架构中,应用范围广。
针对不同架构,如:ARM、SPARC、DSP、PowerPC等构建相应的嵌入式软件目标码分析技术,能够准确分析嵌入式软件目标码的反汇编文件中的函数名称、函数所有的指令地址信息、函数中分支指令的信息,分支指令的PC地址,分支指令的跳转地址,分支指令的下一条地址等信息、PC指令地址所对应源码的行号信息等。通过这些基础信息,与执行信息配合实现统计覆盖率信息。
(3)实现了针对数据缓存技术的存储空间的优化,压缩了实时更新的缓存文件的体积。
反汇编和数据分析都是一个比较耗时的阶段,对于大型嵌入式软件可能会有几十万甚至上百万的指令数量级,每次进行分析都会耗费一定的时间,为减少时间上的浪费,提出数据缓存技术,在执行的目标码不变的情况下,尽可能的存储下所有固定分析数据,如目标码的反汇编文件,反汇编文件分析结果,源码文件分析结果等。都可以存储下来,但是在目标码文件修改后,所有缓存文件都需要进行相应更新。
实施例二
请参见图3,其示出了一种代码执行覆盖率统计的装置的结构图,该装置包括:
目标码覆盖率统计模块,用于解析目标码的函数信息,从中得到目标码函数指令信息、目标码函数分支指令信息、目标码指令对应源码信息。以及用于根据目标码函数指令信息、目标码函数分支指令信息和目标码指令对应源码信息来计算目标码覆盖率。具体而言,目标码覆盖率统计模块能够根据本发明的上述目标码执行覆盖率统计的方法来计算目标码覆盖率,在此不再赘述。
源代码覆盖率统计模块,用于将源代码抽象为语法树,解析该语法树得到源码函数信息。解析源码函数信息,从中得到源码函数行号信息和源码函数分支行号信息。以及根据目标码指令对应源码信息、源码函数行号信息和源码函数分支行号信息来计算源码覆盖率。具体而言,源代码覆盖率统计模块能够根据本发明的上述源代码执行覆盖率统计的方法来计算源代码覆盖率,在此不再赘述。
综上所述,本发明提供的代码执行覆盖率统计的装置,实现了一种无需插桩代码就能统计覆盖率的方法和装置,能有效避免软件生产工艺中插桩码冗余导致软件漏洞、生成的目标码文件的存储体积增大导致无法下载到目标板、以及插桩导致源代码修改频繁的问题,从而提高软件产品的稳定性和可靠性,减少生产软件产品的人工成本。
具体而言,本发明首先能够解决覆盖率统计时,由于插桩代码来进行统计覆盖率情况导致的程序运行不可控甚至运行错误等一系列问题,插桩代码即现有技术中的和代码执行无关仅仅用以统计覆盖率的标志。其次,由于仿真内存可配且本发明无需于源代码中添加插桩来计算覆盖率,进而压缩了目标码体积,使目标码不受硬件内存过小的限制,因此本发明能够从根源解决插桩后导致的无法下载到目标板的问题。而更为重要的是,基于指令流记录的真实程序运行过程统计也比插桩软件算法统计出的结果更具有说服力:其一传统计算方式仅仅通过源码计算覆盖率还包括源代码冗余和插桩错误的问题,其二建立在反汇编统计数据上计算得到的源码覆盖率更为准确。
本发明较现有技术具备以下优点:
(1)实现了目标码和源码覆盖率统计的零插桩技术
零插桩统计覆盖率需要分析的是嵌入式软件的基本特性和执行特性。在不插桩的前提下,使用反汇编工具生成嵌入式软件目标码的反汇编文件,通过分析反汇编文件获取想要的基础信息,如函数指令信息,地址对应源码行号信息等。再与仿真验证工具配合获取执行PC地址信息,分析嵌入式软件的执行覆盖情况,实现零插桩分析覆盖率的目的。
(2)实现了支持多架构的嵌入式软件目标码分析技术,通过目标码文件来同时统计源码和目标码覆盖率,不仅仅稳定性、可靠性和准确率高,还能快速移植到不同架构中,应用范围广。
针对不同架构,如:ARM、SPARC、DSP、PowerPC等构建相应的嵌入式软件目标码分析技术,能够准确分析嵌入式软件目标码的反汇编文件中的函数名称、函数所有的指令地址信息、函数中分支指令的信息,分支指令的PC地址,分支指令的跳转地址,分支指令的下一条地址等信息、PC指令地址所对应源码的行号信息等。通过这些基础信息,与执行信息配合实现统计覆盖率信息。
(3)实现了针对数据缓存技术的存储空间的优化,压缩了实时更新的缓存文件的体积。
反汇编和数据分析都是一个比较耗时的阶段,对于大型嵌入式软件可能会有几十万甚至上百万的指令数量级,每次进行分析都会耗费一定的时间,为减少时间上的浪费,提出数据缓存技术,在执行的目标码不变的情况下,尽可能的存储下所有固定分析数据,如目标码的反汇编文件,反汇编文件分析结果,源码文件分析结果等。都可以存储下来,但是在目标码文件修改后,所有缓存文件都需要进行相应更新。
实施例三
本发明提供了一种代码执行覆盖率统计的计算设备。该计算设备包括:一个或多个处理器;存储器;以及一个或多个程序,其中一个或多个程序存储在存储器中并被配置为由一个或多个处理器执行,一个或多个程序包括用于执行根据本发明的代码执行覆盖率统计方法的指令。
更进一步地,本发明提供了一种存储一个或多个程序的计算机可读存储介质,一个或多个程序包括指令,该指令当由计算设备执行时,使得计算设备执行根据本发明的代码执行覆盖率统计方法中的方法。
综上所述,本发明的代码执行覆盖率统计的计算设备及存储介质,实现了一种无需插桩代码就能统计覆盖率的方法和装置,能有效避免软件生产工艺中插桩码冗余导致软件漏洞、生成的目标码文件的存储体积增大导致无法下载到目标板、以及插桩导致源代码修改频繁的问题,从而提高软件产品的稳定性和可靠性,减少生产软件产品的人工成本。
具体而言,本发明首先能够解决覆盖率统计时,由于插桩代码来进行统计覆盖率情况导致的程序运行不可控甚至运行错误等一系列问题,插桩代码即现有技术中的和代码执行无关仅仅用以统计覆盖率的标志。其次,由于仿真内存可配且本发明无需于源代码中添加插桩来计算覆盖率,进而压缩了目标码体积,使目标码不受硬件内存过小的限制,因此本发明能够从根源解决插桩后导致的无法下载到目标板的问题。而更为重要的是,基于指令流记录的真实程序运行过程统计也比插桩软件算法统计出的结果更具有说服力:其一传统计算方式仅仅通过源码计算覆盖率还包括源代码冗余和插桩错误的问题,其二建立在反汇编统计数据上计算得到的源码覆盖率更为准确。
本发明较现有技术具备以下优点:
(1)实现了目标码和源码覆盖率统计的零插桩技术
零插桩统计覆盖率需要分析的是嵌入式软件的基本特性和执行特性。在不插桩的前提下,使用反汇编工具生成嵌入式软件目标码的反汇编文件,通过分析反汇编文件获取想要的基础信息,如函数指令信息,地址对应源码行号信息等。再与仿真验证工具配合获取执行PC地址信息,分析嵌入式软件的执行覆盖情况,实现零插桩分析覆盖率的目的。
(2)实现了支持多架构的嵌入式软件目标码分析技术,通过目标码文件来同时统计源码和目标码覆盖率,不仅仅稳定性、可靠性和准确率高,还能快速移植到不同架构中,应用范围广。
针对不同架构,如:ARM、SPARC、DSP、PowerPC等构建相应的嵌入式软件目标码分析技术,能够准确分析嵌入式软件目标码的反汇编文件中的函数名称、函数所有的指令地址信息、函数中分支指令的信息,分支指令的PC地址,分支指令的跳转地址,分支指令的下一条地址等信息、PC指令地址所对应源码的行号信息等。通过这些基础信息,与执行信息配合实现统计覆盖率信息。
(3)实现了针对数据缓存技术的存储空间的优化,压缩了实时更新的缓存文件的体积。
反汇编和数据分析都是一个比较耗时的阶段,对于大型嵌入式软件可能会有几十万甚至上百万的指令数量级,每次进行分析都会耗费一定的时间,为减少时间上的浪费,提出数据缓存技术,在执行的目标码不变的情况下,尽可能的存储下所有固定分析数据,如目标码的反汇编文件,反汇编文件分析结果,源码文件分析结果等。都可以存储下来,但是在目标码文件修改后,所有缓存文件都需要进行相应更新。
以上对本发明的代码执行覆盖率统计的方法、装置及计算设备的实施方式进行了说明,其目的在于解释本发明之精神。请注意,本领域技术人员可以在不脱离本发明的精神的情况下对上述各实施方式的特征进行修改和组合,因此,本发明并不限于上述各实施方式。对于本发明的代码执行覆盖率统计的装置及计算设备的具体特征如形状、尺寸和位置可以上述披露的特征的作用进行具体设计,这些设计均是本领域技术人员能够实现的。而且,上述披露的各技术特征并不限于已披露的与其它特征的组合,本领域技术人员还可根据发明之目的进行各技术特征之间的其它组合,以实现本发明之目的为准。
Claims (10)
1.一种代码执行覆盖率统计的方法,其特征在于,所述方法包括:
解析目标码的函数信息,从中得到目标码函数指令信息、目标码函数分支指令信息、目标码指令对应源码信息;其中,所述目标码指令对应源码信息包括函数总语句数和函数内具有对应关系的行号数;
根据所述目标码函数指令信息、目标码函数分支指令信息和目标码指令对应源码信息来计算目标码覆盖率;
将源代码抽象为语法树,解析该语法树得到源码函数信息;
解析所述源码函数信息,从中得到源码函数行号信息和源码函数分支行号信息;
根据所述目标码指令对应源码信息、源码函数行号信息和源码函数分支行号信息来计算源码覆盖率。
2.根据权利要求1所述的代码执行覆盖率统计的方法,其特征在于,解析目标码的函数信息具体包括:
处理反汇编文件信息,提取反汇编文件的指令行号与指令地址的对应信息;根据反汇编文件的指令行号得到与该指令行号对应的源代码中的指令行号;以及根据源代码中的指令行号动态执行的指令地址得到源代码的指令执行行号的指令地址。
3.根据权利要求2所述的代码执行覆盖率统计的方法,其特征在于,处理反汇编文件信息,提取反汇编文件的行号与指令地址对应信息包括:
解析反汇编文件获取所有的函数指令地址信息和跳转指令信息。
4.根据权利要求3所述的代码执行覆盖率统计的方法,其特征在于,获取跳转信息包括:
获取跳转指令的地址,来确定这个跳转指令是否被执行;
获取跳转的地址,来确定是否进入True分支;
获取跳转指令的下一条地址,来确定是否执行False分支。
5.根据权利要求2所述的代码执行覆盖率统计的方法,其特征在于,解析所述源码函数信息,从中得到源码函数行号信息和源码函数分支行号信息包括:
获取到抽象语法树后提取语法数中代码块的行号;根据代码块的类型来判断代码是否执行,且记录指令执行行号以及该指令执行行号对应的指令地址;其中,
代码块的类型包括for代码块、if代码块、else代码块、while代码块、switch代码块、case代码块、default代码块;
若代码块的类型为for代码块或while代码块时,如果执行了该分支起始行则判断执行了该分支的False分支,记录False分支相关的指令信息;如果执行了分支块内的代码则判断为执行了该分支的True分支,记录True分支相关的指令信息。
8.一种代码执行覆盖率统计的装置,其特征在于,所述装置包括:
目标码覆盖率统计模块,用于解析目标码的函数信息,从中得到目标码函数指令信息、目标码函数分支指令信息、目标码指令对应源码信息;以及用于根据所述目标码函数指令信息、目标码函数分支指令信息和目标码指令对应源码信息来计算目标码覆盖率;其中,所述目标码指令对应源码信息包括函数总语句数和函数内具有对应关系的行号数;
源代码覆盖率统计模块,用于将源代码抽象为语法树,解析该语法树得到源码函数信息;解析所述源码函数信息,从中得到源码函数行号信息和源码函数分支行号信息;以及根据所述目标码指令对应源码信息、源码函数行号信息和源码函数分支行号信息来计算源码覆盖率。
9.一种计算设备,包括:
一个或多个处理器;
存储器;以及
一个或多个装置,所述一个或多个装置包括用于执行根据权利要求1-7中任一项所述的方法的指令。
10.一种存储一个或多个程序的计算机可读存储介质,所述一个或多个程序包括指令,所述指令当由计算设备执行时,使得所述计算设备执行根据权利要求1-7中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210245230.9A CN114661588A (zh) | 2022-03-14 | 2022-03-14 | 代码执行覆盖率统计的方法、装置及计算设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210245230.9A CN114661588A (zh) | 2022-03-14 | 2022-03-14 | 代码执行覆盖率统计的方法、装置及计算设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114661588A true CN114661588A (zh) | 2022-06-24 |
Family
ID=82030058
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210245230.9A Pending CN114661588A (zh) | 2022-03-14 | 2022-03-14 | 代码执行覆盖率统计的方法、装置及计算设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114661588A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115576562A (zh) * | 2022-09-29 | 2023-01-06 | 中国科学院软件研究所 | 基于二进制重写的模糊测试插桩优化方法及装置 |
CN115982058A (zh) * | 2023-03-20 | 2023-04-18 | 中国空气动力研究与发展中心计算空气动力研究所 | 一种计算流体力学代码错误定位方法、装置、设备及介质 |
CN116090375A (zh) * | 2023-03-01 | 2023-05-09 | 上海合见工业软件集团有限公司 | 基于覆盖率数据确定目标驱动源码的系统 |
-
2022
- 2022-03-14 CN CN202210245230.9A patent/CN114661588A/zh active Pending
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115576562A (zh) * | 2022-09-29 | 2023-01-06 | 中国科学院软件研究所 | 基于二进制重写的模糊测试插桩优化方法及装置 |
CN116090375A (zh) * | 2023-03-01 | 2023-05-09 | 上海合见工业软件集团有限公司 | 基于覆盖率数据确定目标驱动源码的系统 |
CN116090375B (zh) * | 2023-03-01 | 2024-02-02 | 上海合见工业软件集团有限公司 | 基于覆盖率数据确定目标驱动源码的系统 |
CN115982058A (zh) * | 2023-03-20 | 2023-04-18 | 中国空气动力研究与发展中心计算空气动力研究所 | 一种计算流体力学代码错误定位方法、装置、设备及介质 |
CN115982058B (zh) * | 2023-03-20 | 2023-07-07 | 中国空气动力研究与发展中心计算空气动力研究所 | 一种计算流体力学代码错误定位方法、装置、设备及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN114661588A (zh) | 代码执行覆盖率统计的方法、装置及计算设备 | |
Hu et al. | Binary code clone detection across architectures and compiling configurations | |
US8381194B2 (en) | Methods and apparatuses for selective code coverage | |
Hoschele et al. | Mining input grammars with AUTOGRAM | |
US20110047531A1 (en) | Methods and apparatuses for selective code coverage | |
Liu et al. | Binary code analysis | |
CN111813672B (zh) | 一种针对多种处理器架构的非侵入式覆盖率统计方法 | |
US8296254B2 (en) | Data flow analyzing apparatus, data flow analyzing method and data flow analyzing program | |
CN109214149B (zh) | 一种mips固件基地址自动化检测方法 | |
CN108027748A (zh) | 指令集模拟器及其模拟器生成方法 | |
Chen et al. | Cati: Context-assisted type inference from stripped binaries | |
CN102722438B (zh) | 一种内核调试的方法和设备 | |
KR20140050323A (ko) | 라이선스 검증 방법 및 그 장치 | |
CN117573142A (zh) | 基于模拟执行的java代码反混淆器 | |
CN107402799A (zh) | 在x86电脑超高速解释执行tms320c25芯片汇编指令的方法 | |
CN116305159A (zh) | 一种基于相似性判定的固件供应链漏洞传播分析方法 | |
CN114816436A (zh) | 一种基于反汇编的源码解析装置 | |
Pauley et al. | Performant binary fuzzing without source code using static instrumentation | |
US8370797B2 (en) | Data processing apparatus, method therefor, and computer program | |
CN114816435A (zh) | 一种基于逆向技术的软件开发方法 | |
CN114594962A (zh) | 机器码的反汇编系统、反汇编方法、计算机设备及存储介质 | |
CN112380133A (zh) | 一种指令集模拟器利用功能库仿真的方法及装置 | |
Puhan et al. | Program crash analysis based on taint analysis | |
Kanev et al. | Portable trace compression through instruction interpretation | |
CN116501378B (zh) | 一种逆向工程还原源代码的实现方法、装置和电子设备 |
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 |