APP下载

基于缺陷模式匹配的静态源码分析技术研究

2016-12-15吴伟明谷勇浩

软件 2016年11期
关键词:软件缺陷词法软件测试

孔 军,吴伟明,谷勇浩

(北京邮电大学 计算机学院,北京 100876)

基于缺陷模式匹配的静态源码分析技术研究

孔 军,吴伟明,谷勇浩

(北京邮电大学 计算机学院,北京 100876)

随着信息技术的飞速发展,应用软件的规模不断扩大,越来越多的软件安全问题频频出现,因此如何保证和提高软件质量日益成为一个备受关注的问题。研究表明,在测试阶段修正错误所付出的成本比代码编写阶段多出10倍,因此以静态分析的方式来检测软件质量能大大降低投入成本。基于缺陷模式的软件测试是近些年发展起来的一种程序源代码静态分析技术,主要用于自动或者半自动的软件缺陷检测及预防,此类缺陷检测工具由于效率高和使用简单等特点在高可信软件测试中得到了广泛应用。所谓的缺陷模式,是指程序中经常发生的错误或缺陷所呈现出的特定规律。缺陷模式通常由具有领域程序设计经验的人或者测试人员总结出来。本文通过利用开源软件为实验工具,运用静态分析的相关理论,自定义检测器对软件项目做测试得出了一些存在的问题。

软件测试;静态代码;缺陷模式;检测器

本文著录格式:孔军,吴伟明,谷勇浩. 基于缺陷模式匹配的静态源码分析技术研究[J]. 软件,2016,37(11):146-149

0 引言

随着信息技术的发展,软件的规模不断扩大,越来越多的软件安全问题频频出现,因此如何保证和提高软件质量在互联网中成为一个备受关注的问题。根据Boehm的统计,在软件开发总成本中,用在测试上的开销要占30%到50%,对于某些关系人类生命安全的关键软件[1],其测试费用甚至高达所有其他软件工程阶段费用总和的三到五倍。因此,提高软件测试的有效性和测试效率,降低软件开发成本已成为迫切需要解决的任务。

检测软件安全质量,通常从两个方面进行:动态分析与静态分析。在动态分析中,需要根据实际状况,设计多组极限测试数据,并实际的执行被测

程序;静态分析则是扫描源程序,从中找出可能导致错误的结构异常,控制流异常及数据流异常。静态分析较动态而言,成本低,容易实现,能覆盖所有路径且不依赖于特定的运行环境。根据McConnell所著《Code Complete》中提供的数据,在测试阶段修正错误所付出的成本比代码编写阶段多出10倍。因此采用静态分析的方式来检测软件质量能大大降低成本。

如何保证软件产品的可靠性,一直都是任何软件项目致力解决的问题。影响软件可靠性的因素很多,而软件缺陷是度量软件可靠性的一个重要的指标,减少软件缺陷才能保证软件可靠性。

随着计算机处理速度的飞速提高,以及内存和外存容量的快速增加,软件在整个系统中的重要性变得越来越高,软件的规模和复杂性急剧增加,软件的可靠性面临着危机。软件测试在这一阶段承受了挑战,许多测试理论和测试方法相继诞生,逐渐形成了一套体系,本文的研究便是基于这些理论和方法。

1 常见软件安全质量问题举例

1.1 代码安全问题

1.1.1 SQL注入

SQL注入是一种常见的针对web应用程序的攻击,这是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

1.1.2 XSS攻击

XSS (Cross Site Script) 即为跨站脚本攻击[2]。它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的。

1.2 代码质量问题

1.1.1 空指针引用

空指针(Null Pointer)引用,是程序设计语言中一类常见的动态内存错误。指针变量可以指向堆地址、静态变量和空地址单元,当引用指向空地址单元的指针变量时,就会产生空指针引用故障,有可能产生不可预见的错误,导致软件系统崩。

1.1.2 系统资源未释放

软件开发过程中有很多调用系统或处理器资源的情况,比如文件流和字符流、数据库连接等等,如果开发者在开发软件时疏忽没有意识到这个问题,或者是由于代码问题没有释放资源,就有可能导致系统负载越来越重,严重的会引起系统崩溃,应当重视资源的回收问题。

2 静态分析相关理论

2.1 静态分析技术

代码静态分析是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描[3],验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。目前静态分析技术向模拟执行的技术发展以能够发现更多传统意义上动态测试才能发现的缺陷,例如符号执行、抽象解释、值依赖分析等等并采用数学约束求解工具进行路径约减或者可达性分析以减少误报增加效率。以下为后续实验所需要的具体分析理论。

2.1.1 词法分析生成token流

词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序可以使用Lex等工具自动生成。

词法分析是编译程序的第一个阶段且是必要阶段;词法分析的核心任务是扫描、识别单词且对识别出的单词给出定性、定长的处理;实现词法分析程序的常用途径:自动生成,手工生成。

2.1.2 语法分析生成抽象语法树

语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等。语法分析程序判断源程序在结构上是否正确,源程序的结构由上下文无关文法描述。

2.1.3 语义分析

语义分析也是编译过程的一个逻辑阶段,语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。比如语义分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误[4]。如有的编译程序要对实数用作数组下标的情况报告错误。又

比如某些某些程序规定运算对象可被强制,那么当二目运算施于一整型和一实型对象时,编译程序应将整型转换为实型而不能认为是源程序的错误。

2.2 缺陷模式

软件缺陷是存在于软件中的、不期望的或不可接受的偏差,其结果是当软件运行于某一特定条件时将出现软件故障,软件缺陷以一种静态的形式存在于软件的内部,是软件开发过程中人为错误的结果。软件缺陷的例子有:数组下标不对、循环变量初值设置有误、异常处理方法有误等。

所谓的缺陷模式,是指程序中经常发生的错误或缺陷所呈现出的特定规律。缺陷模式通常由具有领域程序设计经验的人或者测试人员总结出来。

下面给出一个缺陷模式分析的例子:缺陷行为:代码中低效的判断字符串为空的方法缺陷描述:判断字符串为空时,不要用equals()方法,而是1ength方法或属性,判断长

度是否为0。代码图例:

图1 缺陷代码实例

原因分析:相对于equals(“”)方法,判断字符串对象长度是否为零的方法速度更快。

解决办法:应该使用str.1ength() ==0来判断字符串是否为空。

简言之,缺陷模式匹配的静态分析方法就是针对不同的代码缺陷,总结并抽象出特定的缺陷模式,具体分析时再将之具体实现。

3 实验方案

本文采用Findbugs开源软件来作为实验工具,FindBugs 是一个静态分析工具,它检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用Visitor模式[5]。下面分为三个步骤来做实验:

1)最重要的一个环节,根据常见的软件缺陷抽象出相应模式,来实现对应的检测器,这里实现是基于Findbugs源码,在此基础上实现自己用到的检测器。

2)将实现的多个检测器打包,生成Findbugs插件集成在eclipse中。

3)用生成的插件对待测试的一村一品项目源码进行检测。

整体的实验流程图如下所示:

图2 实验流程图

4 实验结果

根据以上实验步骤,得出实验结果,结果中显示有23个软件问题[6],图中的Scary、Troubling、Of Concern代表的是问题的严重等级,而检测结果也有可信度的问题,High confidence即为高可信度,Normal confidence即为一般可信度。下面为实验的结果图:

图3 实验结果图

然后根据每个问题的可信度和严重等级进行了分类统计,下面的表格就是统计的结果:

表1 测试结果分类表

由上面的表格,可以看出,一寸一品项目中存在的代码缺陷问题,SQL注入[7]和资源未释放都是比较严重的问题,当然其中也有字符串判断相等时

用了=字符这种可能会引起逻辑错误的问题。可信度在测试的过程中也是比较重要的一个指标,经过人工检查,高可信的问题中几乎不存在误报,而一般可信的问题中有一部分是误报,因此怎样降低误报率也是以后需要完善的。

5 结论

本文给出了一种基于缺陷模式匹配的静态源码分析研究方法,并做实验验证了这种方法的可行性与正确性,实验中通过发现软件缺陷本身及其产生遵循一定的规律,抽象出存在的一些缺陷模式,并借助开源软件实现了检测器[8],利用开源软件集成实现的检测器来对项目进行了检测,检测出了一些软件常见的质量问题,但同时也发现了一些不足之处,比如发现的问题中有一些是误报的,解决误报问题将会是以后的重点。

[1] 中央网络安全和信息化领导小组成立: 中国从网络大国加速迈向网络强国[J]. 信息安全与通信保密, 2014, 03: 12-13.

[2] 杨洪路, 宫云战, 高文龄, 白哥乐. 软件安全静态检测技术与工具[J]. 信息化纵横, 2009, 09: 70-72.

[3] 牛婷芝. 一种Java源代码安全分析系统的设计与实现[D].北京邮电大学, 2009.

[4] 霍志鹏. 基于静态分析的PHP代码缺陷检测[D]. 北京邮电大学 2015.

[5] 张林, 曾庆凯. 软件安全漏洞的静态检测技术[J]. 计算机工程. 2008(34): 157-159.

[6] 古乐, 史九林. 软件测试技术概述[M]. 北京: 清华大学出版社, 2004.

[7] 赵瑞莲. 软件测试方法研究: [博士学位论文]. 北京: 中国科学院计算技术研究所, 2001.

[8] 万成铖. 一种基于符号执行的Java缺陷检测工具的设计与实现[D]. 北京大学, 2012.

Research on Static Source Analysis Technology Based on Defect Pattern Matching

KONG Jun, WU Wei-ming, GU Yong-hao
(School of Computer Science, Beijing University of Posts and Telecommunications, Beijing 100876, China)

With the rapid development of information technology, the application software continues to expand the scale of software security issues more and more frequent, so how to guarantee and improve the quality of software has become a problem of concern. Research shows that the cost of correcting errors in the testing phase is 10 times more than that of the code, so the quality of the software can be greatly reduced by static analysis. Software testing based on defect pattern is a technique developed in recent years, the source code static analysis, mainly for software defect detection and prevention automatically or semi automatically, this kind of defect detection tool due to the characteristics of high efficiency and simple to use, has been widely used in software testing. The so-called defect mode, is refers to the procedure often occurs the mistake or the flaw place presents the specific rule. Defect modes are often summed up by people or testers who are experienced in the field of program design. In this paper, the use of open source software as an experimental tool, the use of static analysis of the relevant theory, the definition of the software test software project to do some of the existing problems.

Software testing; Static code; Defect pattern; Detector

TP314

A

10.3969/j.issn.1003-6970.2016.11.032

孔军(1991-),男,研究生,主要研究方向:现代网络管理、网络安全;吴伟明,女,教授,主要研究方向:现代网络管理、网络安全;谷勇浩,男,讲师,主要研究方向:网络安全、移动互联网技术

吴伟明,教授,主要研究方向:现代网络管理、网络安全。

猜你喜欢

软件缺陷词法软件测试
基于源文件可疑度的静态软件缺陷检测方法研究
基于OBE的软件测试课程教学改革探索
EXCEL和VBA实现软件测试记录管理
基于NPE-SVM的软件缺陷预测模型
关于软件测试技术应用与发展趋势研究
开源程序的软件缺陷分布特征的量化分析研究
谈对外汉语“词法词”教学
软件测试工程化模型及应用研究
软件缺陷管理方案分析
2010年高考英语“相似”考题例析