朱琦 林挺
摘 要 针对宇航飞行软件对于软件可靠性、安全性设计的要求,本文提出一种基于PYTHON语言实现的宇航飞行软件缺陷检测程序,通过对源代码进行预处理和筛选,生成测试驱动文件,再对测试驱动文件传输到虚拟机系统,依托开源的KLEE生成并运行测试用例,将测试用例运行结果汇总到前端显示,从而实现并验证缺陷检测程序。
关键词 软件缺陷;字典结构;求解器
引言
宇航飞行软件运行环境相对于地面环境存在单粒子效应、高低温、原子氧、空间碎片和电磁辐射等特殊情况[1],同时由于宇航飞行软件的功能日趋复杂,可能存在不易检测的固有设计缺陷,这些缺陷往往会在后期的系统联试中才暴露,甚至在轨长期潜伏,由此带来的损失很大,这要求对软件设计缺陷提前发现和规避,依靠传统测试方法发现显然是比较困难的,而且时间成本较大,国外产品如LDRA Testbed,但是软件版权在国外,源码安全性不可控,因此,研究一套旨在提前发现并纠正缺陷的国产软件缺陷检测程序便提上了议事日程。
PYTHON是一种解释型的脚本语言,具有格式严谨、语法简练以及丰富的数值计算资源,适合开发针对大数据的数据分析和挖掘方面的智能化软件,因此,这里选择基于PYTHON语言实现缺陷检测程序。
1软件整体框架
PYTHON语言在数据提取中可以建立“{关键字:数值}”形式的字典结构,在存储和处理数据中可以通过关键字快速查询到关键字对应的数值,并支持字典嵌套的树形结构,利用这个PYTHON特有的数据结构处理和存储软件代码信息,对源程序工程进行文件遍历,将函数及其所调用到的函数涉及的代码段汇总写入指定名称的C文件中,生成测试该函数的驱动程序[2]。缺陷检测程序的整体结构和框架如下:
图1 宇航飞行软件系统缺陷检测程序的整体框架示意圖
如上图所示,缺陷检测程序首先对源程序工程进行文件遍历,抽取出信息字典,匹配需要测试的函数,将函数及其所调用到的函数涉及的代码段汇总写入指定名称的C文件中,生成测试该函数的测试驱动程序[3]。
2软件实现
首先接收和解析用户命令行传入的参数,使用os库的walk函数对参数SRC所指定的目录下的文件进行两次遍历,第一次筛选所有的类型和宏定义,第二次分析函数和变量。
测试驱动文件生成后,将测试驱动文件按TCP协议打包,按顺序发送给服务端程序,这里使用了PYTHON的socket包来实现文件传输,服务端按客户端报文中指定要求,顺序重组文件数据,生成与主机相同的测试驱动文件。
KLEE是一个运行在 Linux 操作系统上的开源动态符号执行工具,生成的测试用例达到很高的代码覆盖率,这里使用KLEE的STP求解器自动实现测试用例的生成[4]。经过KLEE求解,计算出合适的用例去覆盖源程序的语句、分支和条件组合,生成测试用例,并模拟运行,输出运行结果。
在代码分析过程中,数据流分析、控制流分析、缺陷特征识别是关键步骤,特别是过程间的数据流和控制流分析的完备程度决定了编码缺陷数据的分析能力。
3缺陷检测实验
缺陷检测实验选用的宿主机使用64位Windows10 系统,并安装了与此系统兼容的PYTHON3.5版本,VMWARE9.0下安装了Ubuntu14.04桌面版,分别在宿主机和部署宇航飞行软件系统缺陷检测程序的客户端和服务端程序,检测一段预先编制会导致堆栈溢出的程序。
软件在子程序sc_cast所调用的子程序gioGetBit中发现了可能存在堆栈溢出的问题,并打印出相关位置信息。
4结束语
基于PYTHON的宇航飞行软件系统缺陷检测程序可用于在软件原型开发前期,不具备实际计算机及外围设备支持的情况下,依靠软件静态分析及自动化生成并运行动态测试用例,快速发现和定位宇航飞行软件存在的设计和编码缺陷,从而提升软件可靠性和安全性。
参考文献
[1] 佚名.中国在轨卫星故障实现自动检测[ED/OL].http://tech.sina.com.cn/d/2005-09-08/1355715184.shtml,2005-9-8.
[2] 航天软件产品ADA语言编码规范:Q/RJ 633-2019[S].北京:中国标准出版社,2019.
[3] 航天型号软件C语言安全子集:GJB5369-2005[S].北京:中国标准出版社,2019.
[4] Martins R,Manquinho V,Inês Lynce. An overview of parallel SAT solving[J]. Constraints,2012,17(3):304-347.