APP下载

C++与Java软件重量级静态检查

2016-02-23刘立康

计算机技术与发展 2016年8期
关键词:编译器源代码脚本

姜 文,刘立康

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

C++与Java软件重量级静态检查

姜 文,刘立康

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

为了保证Windows环境下C/C++和Java软件产品质量,对C/C++代码和Java代码进行静态检查非常重要。以SVN作为软件配置管理工具,将重量级静态检查工具Coverity和Fortify集成到持续集成工具ICP-CI上,分别对C/C++代码和Java代码进行重量级静态检查。详细叙述了Windows环境下软件配置管理工具SVN客户端安装,SVN版本库的代码更新,对C/C++和Java代码分别进行Coverity和Fortify编译器的配置、编译脚本编写和在ICP-CI任务管理页面上配置检查任务。介绍了静态检查处理过程,分析了出现各种常见问题的原因并提出了相应的解决方案。给出了一个软件产品中C/C++代码模块和Java代码模块的重量级静态检查应用案例。工作实践表明,进行重量级静态检查有助于及时发现并解决C/C++和Java软件源代码的各种缺陷和安全漏洞,从而提高软件产品的质量和安全性。

Windows操作系统;静态检查;持续集成;安全漏洞

0 引 言

Windows操作系统是具有图形界面的操作系统,是完全的多任务操作系统,是使用最多且排名第一的操作系统。Windows操作系统提供功能强大的应用程序编程接口。目前在Windows环境下流行的软件开发语言主要有C++、C#和Java。

在Windows环境下通常采用集成开发环境Visual Studio进行VC/C++、C#程序设计。VC编译器[1-2]通常位于bin目录中。cl.exe是VC/C++编译器。编译器产生通用对象文件格式(COFF)对象(.obj)文件。LINK.EXE是将通用对象文件格式(COFF)对象文件和库链接起来以创建32位可执行(.exe)文件或动态链接库(DLL)的32位工具。C#编译器是csc.exe。

在Windows环境下通常采用Eclipse进行Java程序设计。Java编程需要下载安装Java的软件开发工具JDK[3-4],JDK目录的bin文件夹中包含Java编译器javac.exe和Java解释器java.exe。Java源程序都是扩展名为.java的文本文件,编译后生成可执行代码,文件名与源文件名相同,扩展名为.class。运行java.exe来执行该Java程序。

在Windows环境下的软件开发大部分都是基于C/C++语言和Java语言。为了保证基于软件产品代码质量,检测软件源代码中存在的缺陷和安全漏洞[5-7]非常重要。文中采用CodeCC(Code Check Center)工具压缩包进行检测。工具压缩包中包括静态检查工具Coverity[8-11]和Fortify[12-15],采用静态检查方法检测源代码的缺陷和安全漏洞,将检查结果反馈给开发人员及时处理,从而提高软件的质量和安全性。

1 重量级静态检查工具

静态测试工具直接对代码进行分析,不需要运行代码,也不需要生成可执行文件。静态测试工具一般是对代码进行语法扫描,找出不符合编码规范的地方,根据某种质量模型评价代码的质量,生成系统的调用关系图等。通常把Coverity和Fortify称为重量级的静态检查工具。

1.1 Coverity Prevent

Coverity Prevent是由美国Coverity公司开发的一款高性能静态检查软件。Coverity公司提供最先进的、可配置的、用于检测软件缺陷和安全隐患的静态源代码分析解决方案。将基于布尔可满足性验证技术应用于源代码分析引擎,分析引擎利用其专利的软件DNA图谱技术和meta-compilation技术,综合分析源代码、编译构建系统和操作系统等可能使软件产生的缺陷。通过对构建环境、源代码和开发过程给出一个完整的分析,建立了高质量软件的标准。Coverity Prevent是第一个能够快速、准确分析当今大规模(几百万甚至几千万行的代码)、高复杂度代码的工具。Coverity解决了影响源代码分析有效性的很多关键问题:构建集成、编译兼容性、高误报率、有效的错误根源分析等。

Coverity Prevent的主要功能包括源代码分析、缺陷管理、扩展工具(Coverity extend)、绘制软件DNA图谱。Coverity Prevent是检测和解决C、C++、Java和C#源代码中严重缺陷的领先自动化方法。在Windows环境下,Coverity Prevent支持集成开发环境Visual Studio,支持VC/C++编译器和C#编译器CSC.exe;支持集成开发环境Eclipse,支持Java编译器javac.exe。

1.2 Fortify SCA

HP Fortify是目前全球最大的静态源代码检测厂商。静态代码分析器Fortify SCA(Static Code Analyzer)是该公司开发的一款软件源代码缺陷静态测试工具。采用数据流分析引擎、语义分析引擎、结构分析引擎、控制流分析引擎、配置分析引擎和特有的X-Tier跟踪器,从不同的方面查看代码的缺陷和安全漏洞。

Fortify SCA通过调用语言的编译器或者解释器把源代码转换成一种中间媒体文件*.nst(Normal Syntax Tree),对应用软件的源代码进行静态分析。在分析过程中与它特有的软件安全漏洞规则集进行全面的匹配、查找,从而将源代码中存在的缺陷和安全漏洞扫描出来,并整理报告。扫描结果中不但包括详细的安全漏洞的信息,还会有相关的安全知识的说明,同时提供修复意见。

Fortify SCA支持的编程语言多达17种,包括C、C++、C#、Java等,基本涵盖了绝大多数的应用,具有相当广泛的适用性。Fortify SCA广泛的适用性使其适用于横跨多种语言的开发和测试。在Windows环境下,Fortify SCA支持集成开发环境Visual Studio,支持VC/C++编译器和C#编译器CSC.exe;支持集成开发环境Eclipse,支持Java编译器javac.exe。

2 软件配置管理和持续集成工具

通常软件产品在开发阶段每天都要把源代码合入版本库中。为了保证软件源代码的质量,每周至少对合入版本库的源代码进行2~3次Coverity和Fortify检查。手动执行脚本调用Coverity和Fortify工具生成编译中间文件后,再上传到分析中心耗时长、效率低,不能及时提供检查结果。

2.1 基本的构建系统模型

现在通常采用持续集成工具来完成静态检查任务。持续集成[16]工具可以提供方便的集成平台,可以设置定时任务,使Coverity和Fortify检查任务能够充分利用非工作时间完成编译和静态分析等比较耗时的执行过程,保证及时得到分析结果,方便开发人员根据检查结果报告修改产品源代码缺陷。图1显示了一个基本的构建系统视图。

图1 构建系统视图

构建流程如下:

(1)软件开发工程师编写或修改代码。

(2)开发工程师向软件配置管理(SCM)系统的版本库提交验证通过的源代码。

(3)持续集成工程师(CIE)编写脚本和静态检查编译器配置。

(4)持续集成工程师在持续集成工具的任务管理页面上配置构建任务和静态检查任务。

(5)持续集成工程师制定构建定时任务(通常是非工作时间)自动进行集成构建。

(6)编译中生成的中间文件上传到静态检查分析中心并运行静态分析工具。

(7)静态检查结果发送到持续集成工具。

(8)持续集成工具通过电子邮件向软件产品经理和开发工程师及时反馈构建结果和静态检查结果。

(9)软件开发工程师下载检查报告及时处理存在的各种问题。

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

2.2 软件配置管理工具SVN

2.2.1 Windows环境下的SVN客户端安装

ICP-CI服务器通常需要安装SVN命令行工具和图形SVN客户端工具TortoiseSVN。安装完成命令行工具和图形客户端工具之后,可以选择安装支持中文操作的软件语言包。

完成SVN工具的安装之后,可以根据配置管理工程师提供的产品代码配置库路径,使用SVN客户端工具的“SVN检出(check out)”功能从配置库下载代码到代理服务器的指定路径下。

2.2.2 SVN版本库的代码更新

持续集成工具ICP-CI需要在版本库锁库之后完成源代码更新,ICP-CI工具执行代码更新时,需要编写批处理脚本Code_Update.bat,把脚本配置在任务中。更新代码的批处理脚本内容如下:

::配置需要更新代码的视图路径

SET CodePath=D:/Code

::解除代码视图中的文件锁定

svn cleanup % CodePath %

::更新代码到视图路径

svn update % CodePath % --accept postpone

3 基于C/C++的静态检查

Windows环境下的C/C++程序设计通常采用Microsoft Visual Studio2010集成工具,但是也有一些老的软件产品C/C++编程采用VC6.0集成工具。对C/C++代码的静态检查需要处理两种情况。

(1)Coverity编译器配置。

软件产品模块进行Coverity检查时,需要在模块源代码进行编译的时候调用Coverity工具中的cov_configure命令。为了在编译过程中成功调用cov_configure命令,需要完成编译器的配置。

对于Windows环境下的C/C++程序,编译器配置在tqeconfig.ini文件中。

编程使用的VC6.0编译器配置内容如下:

msvc=D:ToolsMicrosoft Visual StudioVC98incl.exe

编程使用的Microsoft Visual Studio2010编译器配置内容如下:

msvc=D:ToolsMicrosoft Visual Studio10.0VCincl.exe

在配置过程中需要注意的是,cl.exe为工具的安装路径,实际在配置过程中可以根据Microsoft Visual Studio工具的实际安装路径进行配置。

完成编译器配置后,执行tqeconfig.bat文件,该文件如果执行成功,则将生成相应的配置文件保存在CodeCC oolcoverityconfig目录下。在配置编译器时需要注意tqeconfig.bat脚本的执行结果,当执行窗口中提示执行成功,配置的编译器才能在CodeCC oolcoverityconfig目录下生成对应编译器的配置文件。

完成编译器配置后,需要将持续集成主控服务器和代理服务器上的coverity工具路径:pluginCodeCC oolcoverityin路径添加到环境变量path中。

(2)Coverity编译脚本编写。

Coverity任务配置到ICP-CI上之后,通常由主控服务器将任务下发到代理服务器执行。执行Coverity任务需要编写相应的编译脚本,使Coverity任务执行时能够调用cov-configure来编译Microsoft Visual Studio的工程文件。

编程使用VC6.0,编译脚本内容如下:

cd/d “D:CodeSecurity_Versionsalm_srcMake PC”

“D:ToolsMicrosoft Visual StudioCommonMSDev98BinMSDEV.exe” “Make PC.dsw” /make “Make PC -win32 RELAESE” /clean

“D:ToolsMicrosoft Visual StudioCommonMSDev98BinMSDEV.exe” “Make PC.dsw” /make “Make PC -win32 RELAESE” /rebuild

编程使用Microsoft Visual Studio2010,编译脚本内容如下:

cd/d “D:CodeSecurity_VersionsCZLog”

“D:ToolsMicrosoft Visual Studio 10.0Common7IDEdevenv” “CZLog.sln” / clean

“D:ToolsMicrosoft Visual Studio 10.0Common7IDEdevenv” “CZLog.sln” /Rebuild “RELAESE | Win32”

(3)Fortify编译器配置。

在Windows环境下,进行Fortify检查也需要区分两种不同的情况。

编程使用Visual Studio 2010时,首先需要在Visual Studio 2010 IDE上安装HP Fortify插件HP_Fortify_SCA_and_Apps_4.00_windows_x86.exe,安装过程如下所示:

·将D:ICP_CI_Windows_agentpluginsCodeCC ool下的fortify文件夹备份为fortify_bak,然后新建fortify目录。

·双击HP_Fortify_SCA_and_Apps_4.00_windows_x86.exe进行安装,安装时将安装路径设置到在ICP_CI的CodeCC插件的如下路径:D:ICP_CI_Windows_agentpluginsCodeCC oolfortify。

·在安装过程中,需要选择对应的VS版本,此处选择“VS2010”。

·在安装过程中,还需要选择license,license文件需要选择D:ICP_CI_Windows_agentpluginsCodeCC oolfortify_bakfortify.license,其他安装弹出框选择“next”即可,安装完成之后将fortify_bak覆盖到fortify文件夹下。

·安装完成之后需要打开Visual Studio 2010软件,查看插件是否已经安装(Visual Studio 2010的菜单栏上有HP Fortify的选项即可)。

为了使Fortify工具可以识别和使用C/C++程序的编译器,需要修改Fortify的配置文件,将C/C++程序的编译器配置到CodeCC oolfortifycoreconfig目录下的fortify-sca.properties文件中。

编程使用VC6.0和使用Visual Studio 2010的编译器配置相同,如下所示:

com.fortify.sca.compilers.msdev=com.fortify.sca.util.compilers.DevenvAdapter

com.fortify.sca.compilers.devenv=com.fortify.sca.util.compilers.DevenvNetAdapter

com.fortify.sca.compilers.cl=com.fortify.sca.util.compilers.MicroSoftCompiler

com.fortify.sca.compilers.link=com.fortify.sca.util.compilers.MicrosoftLinker

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

(4)Fortify编译脚本编写。

进行代码编译时,需要将以前编译生成的过程文件与目标文件全部删除。Fortify工具通过跟踪编译器生成中间文件*.nst,如果编译过程中以前的过程文件与目标文件没有删除,Fortify工具无法跟踪编译器生成正确的*.nst文件。

为了使Fortify工具通过跟踪的方式编译生成中间文件*.nst,需要根据软件模块重新编写编译脚本和makefile文件,在编译脚本中嵌入fortify命令。在编译过程中需要调用钩子函数sourceanalyzer.exe文件,将编译器和链接器都挂在钩子上,从而生成中间文件*.nst。

编程使用VC6.0时fortify编译脚本如下所示:

cd/d “D:CodeSecurity_Versionsalm_srcMake PC”

“D:ToolsMicrosoft Visual StudioCommonMSDev98BinMSDEV.exe” “Make PC.dsw” /make “Make PC -win32 RELAESE” /clean

sourceanalyzer -b alm_help_tool_build -clean

sourceanalyzer -b alm_help_tool_build touchless“D:ToolsMicrosoft Visual StudioCommonMSDev98BinMSDEV.exe” “Make PC.dsw” /make “Make PC -win32release” /rebuild

其中,sourceanalyzer表示Fortify工具的执行命令主体;build_id表示Fortify的工程名(不能与Fortify的关键字相同)。

编程使用Visual Studio 2010时fortify编译脚本如下所示:

cd/d “D:CodeSecurity_VersionsCZLog”

“D:ToolsMicrosoft Visual Studio 10.0Common7IDEdevenv” “CZLog.sln” / clean

sourceanalyzer-b CZLog -Xmx1024M

sourceanalyzer -bCZLog touchless -Xmx1024M “D:ToolsMicrosoft Visual Studio 10.0Common7IDEdevenv” “CZLog.sln” /Rebuild “release | Win32”

由于Visual Studio提供的编译器对fortify工具而言属于标准编译器,因此在编写fortify脚本时需要对调用sourceanalyzer这个钩子函数采用“无侵入”式集成[1-2]。“无侵入”集成对钩子函数在调用时有固定格式,具体形式如下:

sourceanalyzer -b touchless make -f xxx.mak

(5)ICP-CI的任务管理页面配置基于C/C++的检查任务。

在ICP-CI的任务管理页面的构建工程上配置CodeCC检查任务,通常Coverity任务和Fortify任务同时配置。以基于C/C++的软件模块Alm为例来描述集成过程。配置Alm模块的CodeCC任务时,在任务栏上选择“CodeCC”任务。

对于Coverity任务,将Alm模块的编译脚本alm_help_update_coverity_build.bat和Alm模块编译脚本路径配置到CodeCC任务类型页面下的编译脚本、编译路径中,选择编译类型为CL,并在任务选项栏添加“Coverity”任务。对于Fortify任务,将Alm模块的Fortify编译脚本alm_help_update_fortify_build.bat以及Alm模块编译脚本路径配置到CodeCC任务的fortifyexecutable配置项中。最后在任务类型中添加“Fortify”任务。CZLog模块在ICP-CI页面上的检查任务配置同上。

完成任务配置之后需要配置检查结果的发送人列表,主送人为该模块的开发工程师与持续集成工程师,抄送人为产品经理、各开发组长。

4 基于Java的静态检查

(1)Coverity编译器配置。

对于Windows环境下的Java程序,将编译器配置在tqeconfig.ini文件中。配置内容如下:java=D:Toolsjdkinjavac.exe。

配置过程也需要根据实际安装路径来完成。

完成编译器配置后,执行tqeconfig.bat文件,该文件如果执行成功,则将生成相应的配置文件保存在CodeCC oolcoverityconfig目录下。在配置编译器时需要注意tqeconfig.bat脚本的执行结果,当执行窗口中提示执行成功,配置的编译器才能在CodeCC oolcoverityconfig目录下生成对应编译器的配置文件。

完成编译器配置后,需要将持续集成主控服务器和代理服务器上的coverity工具路径:pluginCodeCC oolcoverityin路径添加到环境变量path中。

(2)Coverity编译脚本编写。

执行Coverity任务时,需要编写相应的编译脚本,使Coverity任务执行时能够调用cov-configure来编译Java的工程文件。脚本内容如下:

(3)Fortify编译器配置。

在Windows环境下,为了使Fortify工具可以识别和使用Java程序的编译器,需要修改Fortify的配置文件,将Java程序的编译器配置到CodeCC oolfortifycoreconfig目录下的fortify-sca.properties文件中。

Java语言的编译器配置如下所示:

com.fortify.sca.compilers.javac=com.fortify.sca.util.compilers.javacCompiler

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

(4)Fortify编译脚本编写。

进行代码编译时,需要将以前编译生成的过程文件与目标文件全部删除。Fortify工具通过跟踪编译器生成中间文件*.nst,如果编译过程中以前的过程文件与目标文件没有删除,Fortify工具无法跟踪编译器生成正确的*.nst文件。

为了使Fortify工具通过跟踪的方式编译生成中间文件*.nst,需要根据软件模块重新编写编译脚本和makefile文件,在编译脚本中嵌入fortify命令。在编译过程中需要调用钩子函数sourceanalyzer.exe文件,将编译器和链接器都挂在钩子上,从而生成中间文件*.nst。

fortify编译脚本如下所示:

cd/d “D:CodeSecurity_Versions ao_src”

sourceanalyzer -b Nao -Xmx1024M ant -f “D:CodeSecurity_Versions ao_srcuild.xml”

其中,在调用钩子函数sourceanalyzer时,加上-Xmx1024M指令是为了避免分析中间文件时因内存不足导致报内存溢出的错误,在实际操作过程中可以根据编译生成中间文件的代理服务器的系统内存,自行设置这个值。如果代理服务器的内存不能满足,可以考虑增加内存、更换内存较大的代理服务器来完成中间文件编译。

(5)ICP-CI的任务管理页面配置基于Java的检查任务。

以基于Java的软件模块Nao为例来描述集成过程。配置Nao模块的CodeCC任务时,在任务栏上选择“CodeCC”任务。对于Coverity任务,将Nao模块的编译脚本build.xml和Nao模块编译脚本路径配置到CodeCC任务类型页面下的编译脚本、编译路径中,选择编译类型为JAVAC,并在任务选项栏添加“Coverity”任务。对于Fortify任务,将Nao模块的Fortify编译脚本nao_fortify_build.bat以及Nao模块编译脚本路径配置到CodeCC任务的fortifyexecutable配置项中。最后在任务类型中再添加“Fortify”任务。

完成任务执行脚本配置之后需要配置检查结果的发送人列表,主送人为该模块的开发工程师与持续集成工程师,抄送人为产品经理、各开发组长。

5 检查结果分析和处理

5.1 CodeCC检查处理过程

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

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

对检查出来的各种问题,需要开发人员下载检查结果文件,并对检查结果与模块源代码进行分析。确认是源代码问题,修改源代码后重新合入版本库,启动新一轮的CodeCC检查;根据新的检查结果确认代码缺陷是否已经被解决,已经解决掉的缺陷呈现的状态为“Fixed”,呈现状态为“new”缺陷数量减少。分析之后,确认是误报的缺陷,从ICP-CI上显示的Coverity和Fortify工具检查结果页面的“Ignore defects”链接进入由分析服务器指定的缺陷库完成误报缺陷的屏蔽,屏蔽之后的缺陷呈现为“Dismissed”状态。当执行下一次CodeCC检查时,分析结果的缺陷数也会减少。

5.2 CodeCC检查失败的分析和处理

进行CodeCC检查时,难免会出现失败的情况。CodeCC检查失败需要及时发现处理,根据已经失败的模块、构建工程页面上提示失败的信息和构建工程的详细日志文件,来确定该模块CodeCC检查失败的原因,并确定解决问题的方案。

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

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

解决方法如下:

(1)在tqeconfig.ini中配置相应编译器,并执行tqeconfig.bat文件完成配置,或在fortify-sca.properties文件中完成配置。

(2)根据日志所报编译问题,重新编写编译模块的编译脚本。

(3)开发工程师定位模块编译错误,修改后的源代码合入版本库之后重新执行模块的CodeCC检查任务。

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

在分析阶段出错,查看对应的分析日志可以发现大部分是分析服务器问题导致的执行失败,通常表现为上传中间文件压缩包失败、分析结果回传失败等。根据分析日志发现此类问题,需要联系CodeCC工具运维工程师和相关人员解决分析服务器问题。

5.2.3 CodeCC检查文件的比例问题

此类问题需要查看Coverity检查的编译日志文件build.log,在该文件的结尾部分查看模块编译检查文件的百分比,如果模块编译的文件都完成检查,那么检查文件的百分比应该是100%。如果这个百分比值小于100%,需要查找错误。通常这些错误不是产品模块的代码编译错误,而是Coverity检查时产品模块源代码生成中间文件过程中与编译器冲突导致的。为了提高检查的文件比例,需要开发工程师与系统工程师进行分析,尽可能通过修改的源代码进一步提高检查文件的比例。

6 典型案例

某公司有一个软、硬件结合的大型开发项目。采用的软件配置管理工具为SVN,持续集成工具为ICP-CI。1台主控服务器和8台代理服务器参与CodeCC检查。Windows操作系统的版本是Windows 7。采用Visual Studio 2010进行C++程序设计。采用Eclipse 3.6进行Java程序设计。采用的Coverity工具版本为6.5.3;Fortify工具版本为6.00.0096。集成到ICP-CI工具后,使用Shell脚本和ANT脚本完成对软件模块的Coverity检查和Fortify检查。

以C++的Alm模块与CZLog模块为例,对该模块进行检查的扫描结果如表1所示。

以Java的Nao模块为例,对该模块进行检查的扫描结果如表2所示。

表1 对Alm工具进行Coverity检查和Fortify检查的扫描结果

表2 对Nao工具进行Coverity检查和Fortify检查的扫描结果

检查结果报告中分别给出了Coverity检查和Fortify检查的告警级别、告警数量,并详细列举了缺陷的类型与种类。开发工程师通过下载检查结果报告,对产品源代码进行分析和处理。经过对Alm模块和Nao模块的代码优化、重构以及误报告警屏蔽,最终将Alm模块和Nao模块的告警数目清零,修正了模块源代码存在的缺陷,改进了模块的源代码质量。

工作实践表明,重量级静态检查有助于及时发现并解决C/C++与Java软件源代码的各种缺陷,便于产品主管了解工作进度和解决存在的问题,进一步提升产品质量。

7 结束语

长期的工作实践表明,在Windows环境下进行C/C++和Java软件开发,Coverity和Fortify组成的重量级静态检查工具在开发过程中发挥了重要作用。检查工具集成到持续集成工具ICP-CI,可以自动完成检查,快速地向软件开发人员反馈检查结果,使软件开发人员能够及时修复源代码的缺陷,同时也给项目管理提供了很好的保证。在软件开发过程中做好静态检查工作将在很大程度上提高产品的质量,降低软件开发的成本。

[1] 白 乔,左 飞.把脉VC++[M].北京:电子工业出版社,2009.

[2] 张立勇,刘 坚,陈 平.C/C++程序的静态安全分析[J].系统工程与电子技术,2008,30(6):1155-1158.

[3] 张 峰.Java程序设计与项目实战[M].北京:清华大学出版社,2011.

[4] 赵 平.JAVA源代码静态分析系统的设计与实现[D].长春:吉林大学,2013.

[5] Stiehm T,Gotimer G.Building security in using continuous integration[J].The Journal of Defense Software Engineering,2010,23(2):24-27.

[6] 路晓波.软件开发过程中白盒测试方法和工具的研究及应用[D].南京:南京邮电大学,2012.

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

[8] Almossawi A,Lim K,Sinha T.Analysis tool evaluation:coverity prevent[R].[s.l.]:Carnegie Mellon University,2006.

[9] Coverity® 6.6deployment guide planning,installation,tuning,and supported platforms[R].[s.l.]:Coverity Inc,2013.

[10] Coverity® scan:2013 open source report[R].[s.l.]:Coverity Inc,2014.

[11] Coverity® scan open source report 2014[R].[s.l.]:Synopsys Inc,2015.

[12] Fortify source code analyzer用户指南(版本5.1)[M].[s.l.]:Fortify Software Inc,2008.

[13] Fortify SCA user guide fortify 360 version 2.6[M].[s.l.]:Fortify Software Inc,2010.

[14] Blay P,Corlett S.Fortify SCA performance guide[M].[s.l.]:Fortify Software Inc,2014.

[15] Fortify source code analysis suite tutorial[M].[s.l.]:Fortify Software Inc,2010.

[16] 罗时飞.敏捷持续集成(CruiseControl版):高效硏发之道[M].北京:电子工业出版社,2008.

Heavy-weight Static Checking of Software in C/C++ and Java

JIANG Wen,LIU Li-kang

(School of Telecommunication Engineering,Xidian University,Xi’an 710071,China)

In order to ensure the quality of code in language C/C++ and Java based on Windows,it is very important for the static checking to code of C/C++ and Java.With SVN as configuration management tool,the heavy-weight static checking tools Coverity and Fortify are integrated into continuous integration tool ICP-CI,and static checking is to be done for both C/C++ and Java.The SVN client installation and the code updating of the SVN repository under Windows is described in details,and the Coverity and Fortify compiler configuration,the compiler scripts writing,and the inspection tasks configuration on ICP-CI task management page are conducted for both C/C++ and Java.The process of the static checking is introduced and the causes of problems are analyzed and the corresponding solutions are given.Finally the heavy-weight static checking applied in a case for both modules of code in C/C++ and Java in software product is introduced.Practice shows that the static checking is helpful to discover and solve all kinds of flaws of the code in C/C++ and Java timely,improving quality and safety for software.

Windows operating system;static checking;continuous integration;security vulnerabilities

2015-12-12

2016-04-05

时间:2016-08-01

国家部委基础科研计划:国防预研基金项目(A1120110007)

姜 文(1986-),女,工程师,硕士,CCF会员,研究方向为图像处理与分析、数据库应用和软件工程;刘立康,副教授,研究方向为数字通信、图像传输与处理、图像分析与识别等。

http://www.cnki.net/kcms/detail/61.1450.TP.20160801.0907.054.html

TP311.56

A

1673-629X(2016)08-0017-07

10.3969/j.issn.1673-629X.2016.08.004

猜你喜欢

编译器源代码脚本
酒驾
基于TXL的源代码插桩技术研究
面向理想性能空间的跨架构编译分析方法
运行速度大突破华为《方舟编译器》详解
自动推送与网站匹配的脚本
基于语法和语义结合的源代码精确搜索方法
解密别克安全“源代码”
优化编译器的设计
基于ARM嵌入式平台的x86译码SOC架构设计
愚公移山