第1章 文献综述
1.1 研究目的及意义
在源代码的开发过程中,源代码可靠性显得越来越重要,对源代码进行测试是保证源代码质量很重要的一环,源代码质量问题已成为制约计算机发展的主要因素之一。作为保证源代码质量和可靠性的手段,源代码测试起着不可替代的作用;而源代码静态信息是在源程序进行动态测试前进行,成为减少源代码缺陷,提高源代码质量不可缺少的一个环节。
源代码质量是源代码的根本,是源代码产业的生命。源代码测试是源代码生命周期中的重要环节,是保证源代码质量的重要手段。在美国的一份技术报告中明确的指出:源代码工业中,源代码质量将会成为源代码产品能否成功的支配因素。据权威研究机构统计分析表明,国外源代码开发40%的工作量用在源代码测试上,源代码测试费用占源代码开发总费用的30%至50%,对于一些要求高可靠性、高安全性的源代码,测试费用可能相当于整个源代码开发总费用的3至5倍。由此可见,要成功开发出高质量的源代码产品,必须重视并加强源代码测试工作。对源代码测试理论和方法的研究必须加强,以解决目前源代码测试的低效率、高成本、测试效果不佳等方面的问题。达到在降低测试成本的同时,能发现更多的源代码质量问题,提高源代码质量和生产力。
由于在源代码开发后期发现错误进行修改是早期发现进行修改所需成本的好多倍,因此在动态测试前对源代码进行源代码静态信息可以尽早的发现源代码中的错误,能加快开发时间,提高产品质量,减少源代码的开发成本。随着源代码规模的不断扩大,源代码变的越来越复杂,人工走查己变的越来越困难,由于对代码进行人工走查会做很多重复性的劳动,而且人会受到精神状态,客观环境等因素的影响,导致检查效率比较低,不同的人对同样的源代码检查的结果也可能会不一致,自动化分析提取能增加源代码质量的信任度,因此源代码测试的自动化是源代码测试的发展趋势.随着源代码技术的发展,手工测试己不能满足源代码测试的要求。另外,开发自动化的源代码静态信息提取有利于实现测试自动化,因此开发一个简洁、高效的源代码静态信息提取具有很大的实用价值和商业前景。
1.2 国内外研究现状
源代码测试按测试类型可分为静态测试和动态测试,而源代码静态信息是静态测试的基础。源代码静态信息提取的代表主要有Telelogic公司的Logiscope源代码、富士通(中国)信息系统有限公司的PG-Relief,北京航空航天大学源代码工程研究所开发的SafePro C/C++及一些开源的源代码静态信息提取,首先对这些源代码静态信息提取的主要功能和特点进行说明。
LOGISCOPE是法国Telelogic公司推出的专用于源代码质量保证和源代码测试的产品。其主要功能是对源代码做质量分析和测试以保证源代码的质量,并可做认证、反向工程和维护,特别是针对要求高可靠性和高安全性的源代码项目和工程。LOGISCOPE是一组嵌入式源代码测试提取集。LOGISCOPE产品主要有3个功能:
(1) Logiscope RuleChecker语法规则分析功能:根据工程中定义的编程规则自动检查源代码代码错误,可直接定位错误。包含大量标准规则,用户也可定制创建规则,自动生成测试报告。
(2) Logiscope Audit源代码静态信息功能:定位错误模块,可评估源代码质量及复杂程度;提供代码的直观描述,自动生成源代码文档。
(3) Logiscope TestChecker测试覆盖分析:显示没有测试的代码路径,基于源码结构分析。直接反馈测试效率和测试进度,协助进行衰退测试。支持不同的实时操作系统、支持多线程。自动生成定制报告和文档。
PG-Relief (ProGramming Reliable Check Effector)是对源代码进行静态测试和度量统计的提取。其中,对C语法部分共有200个左右检测点(check points),对C++语法部分共有1000个左右检测点(check points),这些检测点主要包括以下种类的错误和缺陷:
(1)信任性缺陷:编译器中可能无法检出的缺陷;
(2)效率性缺陷:有可能增加程序的复杂度的代码;
(3)维护性缺陷、移植性缺陷移:妨碍代码理解的冗余代码以及不同的编译器所做出的解释不同的代码,同时对源代码的规模和复杂度进行度量。
SafePro C/C++不仅是一个重要的源代码测试提取,还支持C/C++源代码的辅助理解;支持包括Microsoft Visual C++,Borland C/C++,Turbo C/C++,Microsoft C等多种C /C++语言的源代码测试。借助Safepro C/C++,用户可以更快捷有效地理解程序的结构,及早
地发现程序中的暗藏的错误,提高程序的质量。
SafePro C/C++提供多选窗口单驱动的用户工作环境,支持若干种测试信息的快速关联分析,提供了图文并茂的源代码测试结果报告,同时支持静态和动态测试。
市场上的这些源代码静态信息提取,功能很强大,也能对源代码复杂的程序进行源代码静态信息,但这些源代码静态信息提取主要检查源程序的语法规范,在源程序的结构分析方面做的不够,另外在中间信息提取的过程中,中间文件存储的信息结构不是很清晰,不利于功能的扩展,本文对如何提取源程序的信息、如何存储这些信息进行了研究,对函数(/类方法)及函数(/类方法)间调用关系为要素的程序结构分析进行研究,并以树形化更直观的显示。开发出的源代码静态信息提取也有很容易扩展。
1.3 小结
本文对源代码源代码静态信息自动化提取进行研究与实现,列举了几个典型的源代码静态信息提取,并对这些提取的特点进行总结,分析这些源代码静态信息提取的优点和存在的不足,提出本论文开发的源代码静态信息提取要达到的目标和要做的工作,最后,对源代码测试与源代码质量保障的关系进行分析。一些开源的提取及一些商业提取功能都很强大,但不是很灵活,本论文通过自行设计的源代码静态信息提取有利于对功能的不断扩充,也有利于对源代码测试的研究。
第2章 开题报告
2.1 主要研究内容
源代码静态信息提取的主要功能主要有三部分,一是对源代码进行规范性检查;二是对源程序的静态结构分析三是代码质量度量。由于对源程序进行信息提取是对源程序进行源代码静态信息的基础,而源代码静态信息器的设计是难点。本文主要目标是设计的源代码静态信息提取能对C源程序进行基本语法规则检查、并开发出一些规则集,能够很灵活的对规则项进行扩充、能提取源程序的语法树信息,能树形化显示源程序中函数、变量间互相调用关系图、能对源程序的复杂度进行统计。本文主要的工作如下:
(1)弄清楚实现源代码静态信息提取难点和重点;
(2)研究如何提取源程序的静态信息并能清晰的存储这些信息;
(3)对开源编译器GCC的前端进行研究,如何从GCC产生的中间AST文件中进行信息提取;
(4)研究有哪些方式可以实现源代码静态信息器;
(5)以XML格式描述源程序的静态信息,并以树形化结构显示源程序的静态结构图。
2.2 研究方案
代码源代码静态信息是通过对程序扫描找到匹配某种规则模式的代码从而发现代码中存在的问题,例如可以定位strcpy()这样可能存在漏洞的函数,这样有时会造成将一些正确代码定位为缺陷的问题,因此源代码静态信息有时存在误报率较高的缺陷,可结合动态分析方法进行修正。
(1)词法分析:从左至右一个字符一个字符的读入源程序,对构成源程序的字符流进行扫描,通过使用正则表达式匹配方法将源代码转换为等价的符号(Token) 流,生成相关符号列表,Lex为常用词法分析提取。
(2)语法分析:判断源程序结构上是否正确,通过使用上下文无关语法将相关符号整理为语法树,Yacc为常用提取。
(3)抽象语法树分析:将程序组织成树形结构,树中相关节点代表了程序中的相关代码,目前已有javacc/ Antlra等抽象语法树生成提取。
(4)语义分析:对结构上正确的源程序进行上下文有关性质的审查。
(5)控制流分析:生成有向控制流图,用节点表示基本代码块,节点间的有向边代表控制流路径,反向边表示可能存在的循环;还可生成函数调用关系图,表示函数间的嵌套关系。
(6)数据流分析:对控制流图进行遍历,记录变量的初始化点和引用点,保存切片相关数据信息。
(7)污点分析:基于数据流图判断源代码中哪些变量可能受到攻击,是验证程序输入、识别代码表达缺陷的关键。
(8)无效代码分析,根据控制流图可分析孤立的节点部分为无效代码。
开发一个静态分析工具,可以借助于一些开源工具来辅助生成词法、语法分析器,如Lex和Yacc;另外还可以扩展己有的开源静态分析工具,我们通过扩展开源工具Splint静态分析工具来实现一个功能比较强大的静态分析工具。
2.3 毕业设计成果
1. 实现源码静态分析的提取,源代码进行规范性检查;
2. 对源程序的静态结构分析,对源程序进行代码度量;
3. 认真撰写论文,论文篇幅、格式满足毕设需求。
2.4 时间安排
时间 任务
2019.2 搜集相关资料,阅读相关文献
2019.3 学习算法,搜集数据;完成开题报告,准备开题答辩
2019.4 搭建并调试得到程序源代码静态信息测试,比对测试跟踪结果
2019.5 连接测试与逆向工程,实现源代码测试
2019.6 根据导师的建议,继续完善程序,并撰写毕业论文最终稿,准备答辩
参考文献
[1]常超,刘克胜,赵军. 面向源代码的导向Concolic测试方法研究[J]. 计算机应用研究,2018(1).
[2]杨克,Ke Y,贺也平,etal. 精准执行可达性分析:理论与应用[J]. 软件学报,2018,Vol.29Issue(1):1-22.
[3]谢春丽,蔺疆旭,刘小洋,etal. 改进的卷积神经网络源代码相似性度量方法[J]. 应用数学和力学,2019,40(11):1235-1245.
[4]孔德光,郑烇,陈超,etal. 基于数据融合的源代码静态分析漏洞检测技术[J]. 小型微型计算机系统,2008,29(6):1109-1112.
[5]李珍,邹德清,王泽丽,etal. 面向源代码的软件漏洞静态检测综述[J]. 网络与信息安全学报,2019,5(01):5-18.
[6]章磊,韩建. 一种基于静态分析技术的源代码检测系统及方法:.
[7]饶坤,彭四伟. C/C++源代码静态检测系统的设计和实现[J]. 电子设计工程,2011,19(12):28-31.
[8]刘海燕,杨洪路,王崛. C源代码静态安全检查技术%Static Security Examining for C Source Code[J]. 计算机工程,2004,030(002):28-30.
[9]梁婕,张淼,徐国爱,etal. 基于静态分析技术的源代码安全检测模型[J]. 计算机应用研究,2008(09):149-151.
[10]逄龙,王甜甜,苏小红,etal. 支持多程序语言的静态信息提取方法[J]. 哈尔滨工业大学学报,2011(03):67-71.
[11]王雅文,姚欣洪,宫云战,etal. 一种基于代码静态分析的缓冲区溢出检测算法[J]. 计算机研究与发展,2012,49(4):839-845.
[12]吴伟峰. 静态二进制翻译完备性及代码分析研究[D]. 解放军信息工程大学,2012.
[13]张海龙. 基于缺陷信息的源代码特征挖掘研究[D]. 北京邮电大学,2014.
[13]王培伟,王金锭,谭晓光,etal. 漏洞检测方法及装置:.
[14]王明华,尹恒,Bhaskar AV ,etal. 二进制代码块:面向二进制程序的细粒度控制流完整性校验方法[J]. 信息安全学报,2015,1(2).
[15] Mary Jean Harrold,Dongling Liang and Saurabh Sinha. An Approach To Analyzing and Testing Component-Based Systems[J]. ICSE'99 Workshop on Testing distributed Componented-Based Systems,May 1999.
[16] Robert V Binder. Testing Object-Oriented Systems: Models,Patterns and Tools [M]. Addison-Wesley,1999.