一种驱动程序的代码覆盖率测量方法及装置的制造方法

文档序号:8380867阅读:249来源:国知局
一种驱动程序的代码覆盖率测量方法及装置的制造方法
【技术领域】
[0001]本发明涉及软件测试技术领域,特别涉及一种驱动程序的代码覆盖率测量方法及
目.0
【背景技术】
[0002]驱动程序是操作系统内核的重要组成部分,是计算机系统与外围硬件通信的桥梁。但是由于设备运行的偶发故障,以及驱动开发者使用内核接口不当等问题,驱动程序中往往存在大量的安全隐患。例如Linux操作系统中驱动程序引发的错误占已报告错误的50%左右。同时很多无效或者低效的指令操作会降低驱动程序的实际性能。因此,驱动程序需要进行完善的调试和测试,来找到代码中的安全和性能缺陷。
[0003]在对驱动程序进行调试和测试过程中,很重要的一项指标是程序的代码覆盖率。该项指标可以准确定量地衡量驱动测试过程的有效性,帮助测试人员更好地掌握驱动程序的运行情况。但是,常用的程序代码覆盖率测量方法是基于插装技术实现的,而Linux驱动程序往往使用GCC编译器进行编译链接,该编译器很难支持代码插装。此外,驱动程序用来进行系统与设备的交互,对性能要求较高,因此代码覆盖率测量方法的使用不应带来太大的性能开销。同时,常用的人工注入代码的方法虽然能很好地记录运行时信息,但是工作量很大。

【发明内容】

[0004]为降低代码覆盖率测量的工作量及性能开销,本发明提供了一种驱动程序的代码覆盖率测量方法,所述方法包括:
[0005]S1:对待测试驱动程序的源代码进行编译,以获得中间代码,对所述中间代码中的各基本块添加标号,并对所述中间代码中的各基本块插装传递函数;
[0006]S2:对插装传递函数后的中间代码进行编译,生成可加载的目标文件;
[0007]S3:对所述目标文件进行加载,以运行所述待测试驱动程序;通过所述传递函数获取当前运行的基本块的标号,将获取的标号记录到日志文件中;
[0008]S4:根据所述日志文件中基本块的标号确定所述待测试驱动程序的代码覆盖率。
[0009]其中,步骤SI具体包括:
[0010]SlOl:修改所述待测试驱动程序的Makefile文件,对待测试驱动程序的源代码进行编译,以获得中间代码;
[0011]S102:对所述中间代码中的各基本块按顺序添加标号,记录各基本块的指令数目,并在各基本块的开始处插装传递函数;
[0012]S103:对所述中间代码进行扫描,以获得所述待测试驱动程序的指令总数。
[0013]其中,步骤S2具体包括:
[0014]S201:对所述插装传递函数后的中间代码进行编译,以生成汇编文件;
[0015]S202:对所述汇编文件进行编译,以生成可加载的目标文件。
[0016]其中,步骤S3具体包括:
[0017]S301:对所述目标文件进行加载,以运行所述待测试驱动程序;通过所述传递函数获取当前运行的基本块的标号,将所述获取的标号存储至内存缓冲区;
[0018]S302:当所述内存缓冲区存满时,将所述内存缓冲区中的标号记录到日志文件中。
[0019]其中,步骤S4具体包括:
[0020]S401:去除所述日志文件中重复的标号;
[0021]S402:根据所述日志文件中剩余的标号以及对应基本块的指令数目计算所述待测试驱动程序中运行过的指令总数;
[0022]S403:基于所述待测试驱动程序中运行过的指令总数以及所述待测试驱动程序的指令总数计算所述待测试驱动程序的代码覆盖率。
[0023]本发明还公开了一种驱动程序的代码覆盖率测量装置,所述装置包括:
[0024]标识器,用于对待测试驱动程序的源代码进行编译,以获得中间代码,对所述中间代码中的各基本块添加标号,并对所述中间代码中的各基本块插装传递函数,对插装传递函数后的中间代码进行编译,生成可加载的目标文件;
[0025]记录器,用于对所述目标文件进行加载,以运行所述待测试驱动程序,通过所述传递函数获取当前运行的基本块的标号,将获取的标号记录到日志文件中;
[0026]分析器,用于根据所述日志文件中基本块的标号确定所述待测试驱动程序的代码覆盖率。
[0027]其中,所述标识器进一步用于修改所述待测试驱动程序的Makefile文件,对待测试驱动程序的源代码进行编译,以获得中间代码;对所述中间代码中的各基本块按顺序添加标号,记录各基本块的指令数目,并在各基本块的开始处插装传递函数;对所述中间代码进行扫描,以获得所述待测试驱动程序的指令总数。
[0028]其中,所述标识器进一步用于对所述插装传递函数后的中间代码进行编译,以生成汇编文件;对所述汇编文件进行编译,以生成可加载的目标文件。
[0029]其中,所述记录器进一步用于对所述目标文件进行加载,以运行所述待测试驱动程序,通过所述传递函数获取当前运行的基本块的标号,将所述获取的标号存储至内存缓冲区;当所述内存缓冲区存满时,将所述内存缓冲区中的标号记录到日志文件中。
[0030]其中,所述分析器进一步用于去除所述日志文件中重复的标号;根据所述日志文件中剩余的标号以及对应基本块的指令数目计算所述待测试驱动程序中运行过的指令总数;基于所述待测试驱动程序中运行过的指令总数以及所述待测试驱动程序的指令总数计算所述待测试驱动程序的代码覆盖率。
[0031]本发明能够在不影响操作系统和驱动程序正常运行的条件下,对驱动程序的代码覆盖率进行精确高效的测量,为软件测试和调试提高了很好的支持,同时,不需要程序员手动修改源代码,大大减少了工作量。
【附图说明】
[0032]图1是本发明一种实施方式的驱动程序的代码覆盖率测量方法的流程图;
[0033]图2是本发明一种实施方式的驱动程序的代码覆盖率测量方法中的驱动程序编译流程图;
[0034]图3是本发明一种实施方式的驱动程序的代码覆盖率测量装置的机构框图。
【具体实施方式】
[0035]下面结合附图和实施例,对本发明的【具体实施方式】作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
[0036]图1是本发明一种实施方式的驱动程序的代码覆盖率测量方法的流程图;参照图1,所述方法包括:
[0037]S1:对待测试驱动程序的源代码进行编译,以获得中间代码,对所述中间代码中的各基本块(basic block)添加标号,并对所述中间代码中的各基本块插装传递函数;
[0038]S2:对插装传递函数后的中间代码进行编译,生成可加载的目标文件;
[0039]S3:对所述目标文件进行加载,以运行所述待测试驱动程序,通过所述传递函数获取当前运行的基本块的标号,将获取的标号记录到日志文件中;
[0040]通常程序由基本块和其内部的指令组成,而基本块是不具备分支的程序段,其内部包含多条指令,故而相比采用指令作为记录单元,采用基本块作为记录单元能够大大减少记录的次数,从而提高性能。
[0041]S4:根据所述日志文件中基本块的标号确定所述待测试驱动程序的代码覆盖率。
[0042]本实施方式能够在不影响操作系统和驱动程序正常运行的条件下,对驱动程序的代码覆盖率进行精确高效的测量,为软件测试和调试提高了很好的支持,同时,不需要程序员手动修改源代码,大大减少了工作量。
[0043]需要说明的是,传统的Linux驱动程序由GCC编译器直接编译,但是GCC编译器很难进行代码插装。本实施方式采用LLVM编译器架构,对传统Linux驱动程序的编译链进行改进,并且修改驱动程序的Makefile文件,支持中间代码的插装,从而实现在运行时记录指令执行情况的目的。
[0044]故而,参照图2,本实施方式中的步骤SI可具体包括:
[0045]SlOl:修改所述待测试驱动程序的Makefile文件,对待测试驱动程序的源代码进行编译,以获得中间代码(bytecode);
[0046]本步骤中,采用LLVM编译器构架对待测试驱动程序的源代码进行编译。
[0047]S102:对所述中间代码中的各基本块按顺序添加标号,记录各基本块的指令数目,并在各基本块的开始处插装传递函数;
[0048]S103:对所述中间代码进行扫描,以获得所述待测试驱动程序的指令总数。
[0049]需要说明的是,在确定所述待测试驱动程序的代码覆盖率时,除了需要记录运行的基本块的标号外,还需要获得与标号对应基本块的指令数目以及所述待测试驱动程序的指令总数,而这两个数值可在本步骤中获取到,也可以是预先获取到的,又或是在确定所述待测试驱动程序的代码覆盖率之前获取到的,本实施方式对此不加以限制。
[0050]可理解的是,在本实施方式中是在添加标号时,就记录各基本块的指令数目,并对所述中间代码进行扫描,从而获得所述待测试驱动程序的指令总数,通过查询的方式来获得与标号对应基本块的指令数目。
[0051]当然,步骤SI还可采用其他实现方式,本实施方式对此不加以限制。
[0052]为便于生成可加载的目标文件,可选地,步骤S2具体包括:
[0053]S201:对所述插装传递函数后的中间代码进行编译,以生成汇编文件;
[0054]本步骤中,采用LLVM编译器构架对所述插装传递函数后的中间代码进行编译。
[0055]S202:对所述汇编文件进行编译,以生成可加载的目标文件。
[0056]本步骤中,采用GCC编译器对汇编文件进行编译。
[0057]若每次获取当前运行的基本块的标号后就直接记录到日志文件,会导致写文件的次数过多,导致系统开销过大,为尽可能避免该问题的出现,可选地,步骤S3具
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1