《电子技术应用》

基于VxWorks平台的软件重量级静态检查

2016年微型机与应用第06期
姜文,刘立康
((西安电子科技大学 通信工程学院,陕西 西安710071))
摘要: 为了保证基于VxWorks平台的软件代码的质量,对软件源代码进行静态检查非常重要。以ClearCase作为配置管理工具,将重量级静态检查工具Coverity和Fortify集成到持续集成工具ICPCI上,对软件源代码进行静态检查。详细叙述了Coverity和Fortify编译器的配置,以及在ICPCI工具的任务管理页面上配置检查任务。分析了检查过程中出现各种问题的原因并给出相应的解决方案。最后介绍了一个典型案例。工作实践表明,静态检查有助于及时发现并解决软件源代码的各种缺陷,从而提高软件质量和安全性。

Abstract:

  姜文,刘立康

  (西安电子科技大学 通信工程学院,陕西 西安710071)

  摘要:为了保证基于VxWorks平台的软件代码的质量,对软件源代码进行静态检查非常重要。以ClearCase作为配置管理工具,将重量级静态检查工具Coverity和Fortify集成到持续集成工具ICPCI上,对软件源代码进行静态检查。详细叙述了Coverity和Fortify编译器的配置,以及在ICPCI工具的任务管理页面上配置检查任务。分析了检查过程中出现各种问题的原因并给出相应的解决方案。最后介绍了一个典型案例。工作实践表明,静态检查有助于及时发现并解决软件源代码的各种缺陷,从而提高软件质量和安全性。

  关键词嵌入式操作系统;静态检查;持续集成;安全漏洞

0引言

  VxWorks是实时嵌入式操作系统软件,可以为开发人员提供高效实时的任务调度、中断管理、系统资源管理和任务间通信。VxWorks经过广泛验证,已成功应用在航天、航空、舰船、通信、医疗等关键领域。Tornado[13]是开发VxWorks应用系统的集成开发环境。Tornado IDE采用C/C++语言编程,支持GNU C/C++编译器。

  为了保证基于VxWorks平台的软件代码质量,检测软件源代码中存在的缺陷和安全漏洞非常重要。本文采用CodeCC(Code Check Center)工具压缩包开展检测工作。工具压缩包中包括静态检查工具Coverity和Fortify,采用静态检查方法检测源代码的各种缺陷,将检查结果反馈给开发人员及时处理,从而提高软件的质量和安全性。

1重量级静态检查工具

  通常把Coverity和Fortify称为重量级的静态检查工具。

  Coverity Prevent是由Coverity公司开发的一款高性能静态检查软件,它是检测和解决C、C++、Java和C#源代码中严重缺陷的领先自动化方法。

  Fortify SCA(Static Code Analyzer)是一款软件源代码缺陷静态测试工具,它支持的编程语言多达17种(包括C、C+、C#、JAVA等),基本上涵盖了绝大多数编程语言。

2检查工具集成到持续集成工具ICP-CI

  本文采用的软件配置管理工具是ClearCase,持续集成工具是ICPCI。首先将集成了Coverity和Fortify工具的CodeCC工具的压缩包CodeCC_Win32.zip拷贝到持续集成主控服务器与代理服务器的plugin目录下解压,再分别对Coverity和Fortify工具进行相关的编译器配置,然后完成搭建构建工程。构建工程命名为“产品名_版本号_CodeCheck”。

  2.1ClearCase版本库的代码更新

  持续集成工具ICPCI需要在版本库锁库之后完成源代码更新,然后进行Coverity和Fortify检查。ICPCI工具执行代码更新时,需要编写代码更新的批处理脚本code_update.bat,把代码更新的脚本配置在任务中。

  2.2Coverity编译器配置

  软件产品模块进行Coverity检查时,需要在CodeCC工具的tqeconfig.ini文件中完成编译器的配置。

  对于基于VxWorks平台的软件产品,由于各模块使用的软、硬件差异,可以使用的编译器模块多达40多个。目前常用的编译器有10多个。根据编译器中采用的CPU类型可以将其分为以下3类(mips、ppc、arm),将这些编译器配置在tqeconfig.ini文件中。配置内容如下:

  mips:

  ccmips=C:\\NoDist_Tonado2.2\\host\\x86-32\\bin\\ccmpis.exe

  ccmips=C:\\Tonado2.2\\host\\x86-32\\bin\\ccmpis.exe

  ccmips=C:\\Tonado2.2_1\\host\\x86-32\\bin\\ccmpis.exe

  ccmips=C:\\Tonado2.2_cvm\\host\\x86-32\\bin\\ccmpis.exe

  ccmips=C:\\TonadoHRD\\host\\x86-32\\bin\\ccmpis.exe

  ppc:

  ccppc= C:\\Tonado\\host\\x86-32\\bin\\ccppc.exe

  ccppc= C:\\Tonado2.0\\host\\x86-32\\bin\\ccppc.exe

  ccppc= C:\\Tonado_cxe\\host\\x86-32\\bin\\ccppc.exe

  ccppc= C:\\Tonado_2.2.1_ppc\\host\\x86-32\\bin\\ccppc.exe

  arm:

  ccarm= C:\\TonadoARM\\host\\x86-32\\bin\\ccarm.exe

  完成上述编译器的配置后,执行tqeconfig.bat文件,该文件如果执行成功则将生成相应的配置文件保存在CodeCC\\tool\\coverity\\config目录下。

  完成编译器配置后,需要将持续集成主控服务器和代理服务器上的Coverity工具路径plugin\\CodeCC\\tool\\coverity\\bin添加到环境变量path中。同时需要完成编写编译脚本和makefile文件。Coverity不支持分布式编译加速,编译过程中不能使用分布式编译的脚本。

  2.3Fortify编译器配置

  2.3.1编译文件配置

  基于VxWork操作系统的编译器是风河公司提供的Tornado交叉编译器ccmips、ccppc以及ccarm。为使Fortify工具可以识别和使用这些编译器,需要修改Fortify的配置文件,将VxWorks系统的交叉编译器配置到fortify-sca.properties文件中。VxWorks操作系统的编译过程由编译(cc)、链接(ld)以及打包(ar)这3个部分组成,在配置过程中需要对编译、链接和打包依次进行配置。在fortify-sca.properties文件中添加配置项如下所示:

  com.fortify.sca.compilers.ccmips=com.fortify.sca.util.compilers.Gcccompiler

  com.fortify.sca.compilers.ccarm=com.fortify.sca.util.compilers.Gcccompiler

  com.fortify.sca.compilers.ccppc=com.fortify.sca.util.compilers.Gcccompiler

  com.fortify.sca.compilers.ldmips=com.fortify.sca.util.compilers.ldcompiler

  com.fortify.sca.compilers.ldarm=com.fortify.sca.util.compilers.ldcompiler

  com.fortify.sca.compilers.ldppc=com.fortify.sca.util.compilers.ldcompiler

  com.fortify.sca.compilers.armips=com.fortify.sca.util.compilers.ArUntil

  com.fortify.sca.compilers.ararm=com.fortify.sca.util.compilers. ArUntil

  com.fortify.sca.compilers.arppc=com.fortify.sca.util.compilers. ArUntil

  编译器配置完成之后,需要将持续集成主控服务器与代理服务器上的Fortify工具路径plugin\\CodeCC\\tool\\fortify\\bin添加到环境变量path中。

  2.3.2在makefile文件和编译脚本中嵌入Fortify命令

  Fortify工具通过跟踪编译器生成中间文件*.nst,进行代码编译时需要将以前编译生成的*.obj文件目标文件全部删除,保证Fortify工具跟踪编译器生成正确的*.nst文件。同时需要根据软件模块重新编写编译脚本和makefile文件,在makefile文件和编译脚本中嵌入Fortify命令。

  2.4ICP-CI的任务管理页面上配置检查任务

  在ICP-CI的任务管理页面的构建工程上配置CodeCC检查任务,通常Coverity任务和Fortify任务同时配置。以软件模块mcs为例来描述配置过程。配置mcs模块的CodeCC任务时,在任务栏上选择“CodeCC”任务。对于Coverity任务,将mcs模块的编译脚本make_mcs_one_con.bat脚本和mcs模块编译脚本路径配置到CodeCC任务类型页面下的编译脚本、编译路径中,选择编译类型为gcc,并在任务选项栏添加“Coverity”任务。

  对于Fortify任务,将mcs模块的Fortify编译脚本make_mcs_one_fortify.bat脚本以及mcs模块编译脚本路径配置到CodeCC任务的fortifyexecutable这个配置项中。最后在任务类型中再添加“Fortify”任务。

  CodeCC检查任务配置到ICP-CI上之后,通常由主控服务器将任务下发至代理服务器上执行。

  2.5检查结果分析和处理

  使用工具ICPCI做CodeCC检查时,通常先对模块做Coverity检查,生成的中间文件压缩包上传到指定的分析服务器;接着对模块做Fortify检查,同样将生成的中间文件压缩包上传到同一个分析服务器。此时ICP-CI的执行窗口显示CodeCC任务成功并处于等待分析结果状态。

  当分析服务器分析完毕,将模块的分析结果回传到ICPCI工具,在ICPCI工具的页面上可以看到Coverity和Fortify工具各自的检查结果。检查结果包括模块的各级别缺陷数以及总缺陷数。缺陷级别分为高、中、低3个级别。同时根据检查模块任务配置的邮件主送人和抄送人,给相关管理和开发人员发送邮件。邮件内容为该检查模块的Coverity和Fortify检查日志与检查结果下载路径。

  对检查出来的各种问题,开发人员下载检查结果文件,并对检查结果与模块源代码进行分析。确认是源代码问题,修改源代码后重新合入版本库,启动新一轮的CodeCC检查。分析之后,确认是误报的缺陷,从ICP-CI上显示的Coverity和Fortify工具检查结果的页面的“Ignore defects”链接进入由分析服务器指定的缺陷库完成误报缺陷的屏蔽,屏蔽之后的缺陷呈现为“Dismissed”状态。

3CodeCC检查出现问题的分析和处理

  CodeCC检查失败需要及时发现处理,根据已经失败的模块、构建工程页面上提示的失败信息和构建工程的详细日志文件来确定该模块检查失败的原因和解决问题的方案。CodeCC检查失败通常有在编译阶段出错和在分析阶段出错两类。

  3.1Coverity或Fortify检查在编译阶段出错

  在编译阶段出错,查看对应的编译日志可以发现各种问题(编译器配置问题、编译脚本问题和源代码编译错误等),导致在编译阶段Coverity或Fortify检查报错。解决方法如下:

  (1)重新进行编译器配置;

  (2)根据日志所报编译问题,重新编写编译脚本;

  (3)开发工程师定位模块编译错误,修改源代码。

  3.2Coverity或Fortify检查在分析阶段出错

  在分析阶段出错,查看对应的分析日志可以发现大部分是分析服务器问题导致的执行失败,通常表现为上传中间文件压缩包失败、分析结果回传失败等。根据分析日志发现此类问题,解决分析服务器问题。

  3.3Coverity检查文件的比例问题

  查看Coverity检查的日志文件build.log,在该文件的最后查看模块编译检查文件的百分比,如果编译的文件全部完成检查,百分比值是100%。如果这个百分比值不是100%,需要在日志文件里查找错误。这些错误通常不是软件模块的代码编译错误,而是模块源代码生成中间文件过程中与编译器冲突导致的,需要开发工程师与系统工程师进行分析,通过修改源代码来提高检查文件的百分比。

4典型案例

  某公司的一个软、硬件结合的大型开发项目,总的代码量超过2 000万行,采用的配置管理工具为ClearCase,持续集成使用ICPCI工具。对基于VxWorks操作系统的大量软件模块进行了CodeCC检查,工作实践表明,静态检查有助于及时发现并解决软件源代码的各种缺陷,便于产品项目经理了解工作进度和解决存在的问题,进一步提升产品质量。

5结论

  长期的工作实践表明,CodeCC检查在嵌入式软件开发中可以发挥重要的作用。检查工具集成到持续集成工具ICP-CI,可以自动完成CodeCC检查,及时向开发人员反馈检查结果,使开发人员能够及时修复源代码的缺陷,同时也有益于软件项目管理。软件开发的C静态检查工作做好了,将很大程度上提高软件产品的质量,降低软、硬件开发的成本。

参考文献

  [1] 孔祥营,柏桂枝.嵌入式实时操作系统 VxWorks 及其开发环境 Tornado [M].北京:中国电力出版社,2002.

  [2] 蔡建平.嵌入式软件测试实用技术[M].北京:清华大学出版社,2010.

  [3] 赵泽荣,刘志勇,林琳,等.基于VxWorks的ADSB地面站热备份设计与实现[J].微型机与应用,2014,33(20):7779.

  [4] 吴世忠,郭涛,董国伟,等,软件漏洞分析技术[M].北京:科学出版社,2014.

  [5] ALMOSSAWI A, LIM K,TANMAY.Analysis tool evaluation:coverity prevent[R]. SinhaCarnegie Mellon University, 2006.

  [6] Coverity Inc. Coverity scan:2013 open source report[R].2014.


继续阅读>>