软件测试与质量保证课件 第6章 静态测试_第1页
软件测试与质量保证课件 第6章 静态测试_第2页
软件测试与质量保证课件 第6章 静态测试_第3页
软件测试与质量保证课件 第6章 静态测试_第4页
软件测试与质量保证课件 第6章 静态测试_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章静态测试2本章内容高质量程序代码代码缺陷静态分析技术静态分析工具3本章内容高质量程序代码代码缺陷静态分析技术静态分析工具代码质量高质量代码特点:无运行时异常无安全漏洞可读性强可维护性高可变更性强4高质量程序代码的关键要素高质量代码关键要素:(1)清晰的命名:变量、函数和类的名称应该具有描述性,能够准确表达其用途或功能。(2)简洁的代码结构:代码应该遵循模块化的原则,将功能划分为独立的模块,每个模块负责一个特定的任务。(3)注释和文档:为关键部分的代码添加注释,解释代码的目的和工作原理。(4)错误处理:合理地处理异常情况,例如输入验证、错误检查和异常捕获。(5)性能优化:在编写代码时要考虑性能问题,避免不必要的计算和资源浪费。(6)代码复用:尽量避免重复编写相同的代码,而是通过函数、类或模块来实现代码的复用。(7)单元测试:编写单元测试来验证代码的正确性。(8)版本控制:使用版本控制系统(如Git)来管理代码的版本和变更历史。(9)持续集成和部署:实施持续集成和部署流程,以确保代码的质量得到持续监控和改进。(10)代码审查:定期进行代码审查,让团队成员互相审查彼此的代码,以发现潜在的问题和改进点。5软件开发规范华为C语言编程规范谷歌C++代码规范阿里巴巴Java开发手册航天嵌入式软件C语言开发标准欧洲汽车行业软件可靠性开发标准国军标_5369_2005....6软件开发规范举例1命名

1.1【强制】不得在标识符中使用汉字。

1.2【强制】使用有意义的单词或词组做标识符,只有做为for循环的计数变量才可以使用单字母标识符。2.变量

2.1【强制】变量声明时,每行只写一个变量。

2.2【强制】所有的变量在声明时必须给出初始值。即使本地变量实际的第一次赋值在后面的代码中,也必须在声明的地方给出初始零值。

2.3【强制】只使用int或char、short类型做switch/case语句的判断变量,不使用long。7软件开发规范举例3.函数

3.1【强制】main()函数必须返回类型为int,并且有return语句返回一个值。

3.2【建议】函数的参数的个数不超过5个。

3.3【强制】函数的每个参数都有类型。

3.4【强制】函数所有的参数都必须有标识符。

3.5【强制】函数只有一个return语句。无论函数有几个逻辑出口,只能设计一个代码出口。对于需要返回值的函数,建议启用一个记录返回值的变量,只在函数的最后一句语句做return。8阿里巴巴Java开发手册命名风格阿里巴巴Java开发手册命名风格阿里巴巴Java开发手册命名风格阿里巴巴Java开发手册常量定义AlibabaJavaCodeGuideLines该插件专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按Blocker、Critical、Major三个等级显示出来,并且大部分可以自动修复,它还基于Inspection机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。阿里巴巴规约扫描包括:OOP规约、并发处理、控制语句、命名规约、常量定义、注释规范14本章内容高质量程序代码代码缺陷静态分析技术静态分析工具缺陷软件失效(SoftwareFailure)软件错误(SoftwareError)软件故障(SoftwareFault)如何保证开发代码是否遵守开发规范人工审查工具自动检测16缺陷检测工具KlocworkCoverityFindBugsPMDDTS...17缺陷模式18缺陷模式分类19

缺陷模式故障模式低性能模式疑问代码模式规则模式会导致系统运行错误一般由疏忽造成的会导致软件运行效率低下低水平程序员造成多余、低效的代码不理解、低水平程序员造成的不符合规则的代码低水平程序员造成的语法缺陷语义缺陷语法缺陷——低性能模式这类模式主要包括使用低效函数/代码、使用多余函数、Java中显式垃圾回收、冗余代码、头文件中定义的静态变量、不必要的文件包含、字符串低效操作和有更简单的运算可以替代等。1staticvoidcheck(intarr[]){2 if(arr!=null&arr.length!=0){3 foo();4 }5 return;6}1//Thisisbad2newLong(1).toString();3newFloat(1.0).toString();4//Thisisbetter5Long.toString(1);6Float.toString(1.0);语法缺陷——疑问代码模式该模式主要指代码中容易引起歧义的、迷惑人的编写方式。该类模式主要包括不合适的强制类型转换、条件分支相同、定义或赋值但没有使用的变量、没有意义的代码、不合适的比较、疑问的条件语句、疑问的指针、不必要全局变量、死码和没有意义的计算等1publicstaticdoubleintegral(doublex1,doublex2){2 doublex=x1;3 doubleresult=0;4 doublestep=(x2-x1)/700;5 while(x!=x2){6 result=result+valueFor(x)*step;7 x=x+step;8 }9 returnresult;10}语法缺陷——规则模式软件开发总要遵循一定的规则,某个团队也有一些开发规则,违反这些规则也是不允许的。以下表达式由8个操作符和7个操作数组成,太过复杂,应该简化。(b+c*d)+(b*f(c)*d)语义缺陷——故障模式典型故障模式,也称之为语义缺陷空指针引用(NULLPointerDereferenceFault,NPD)数组越界(OutofBoundsArrayAccessFault,OBAF)资源泄漏(ResourceLeakFault,RLF)内存泄漏(MemoryLeakFault,MLF)缓冲区溢出(BufferOverflowFault,BOF)非法计算(IllegalComputingFault,ILCF)死循环(DeadLoopFault,DLF)整数溢出(IntegerOverflowFault,IOF)...故障模式的空指针引用(NPDF)例子383PV_STATUSRC_UpdateBuffer(VideoEncData*video,IntcurrLayer,Intnum_skip)384{385rateControl*rc=video->rc[currLayer];386MultiPass*pMP=video->pMP[currLayer];387388if(video==NULL||rc==NULL||pMP==NULL)389returnPV_FAIL;…403}缓冲区溢出(BOF)例子没有保证足够的存储空间存储复制过来的数据voidfunction(char*str){charbuffer[10];strcpy(buffer,str);}strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于10,就会造成buffer的溢出,使程序运行出错。存在像strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf()等。对应的有更加安全的函数,即在函数名后加上_s,如scanf_s()函数。故障模式的内存泄漏(MLF)例子179if(file){180 FILE*fp;181 fp=fopen(file,"r");182 if(fp==NULL){183 perror("Cannotfopen");184 exit(-1);185 }186 returnrtnl_from_file(fp,accept_msg,stdout);187 }数组越界故障的故障模式(OBAF)例子【例8.2】下列程序结构:#defineN10……intdata[N];for(i=0;i<=N;++i){intx=new_data(i);data[i]=foo(x);}程序中的data[i]就会产生越界错误。使用未初始化变量故障模式(UVF)例子【例8.3】下列程序:1char*readline(char*buf){2charc;3char*savebuf=buf;4while(c!=EOF&&(c=getchar())!=‘\n’)5*buf++=c;6*buf=‘\0’;7if(c==EOF&&buf==savebuf)8returnNULL;9else10returnsavebuf;11}第2行定义变量c,在第4行使用该变量时,该变量没有被赋初值。故障模式的非法数学计算(IAO)例子967status_tpreProcessImage(Bundle*bundle,constsp<AaptAssets>&assets,968constsp<AaptFile>&file,String8*outNewLeafName)969{……1060if(bundle->getVerbose()){1061fseek(fp,0,SEEK_END);1062size_toldSize=(size_t)ftell(fp);

//fp为空的话,ftell将返回01063size_tnewSize=file->getSize();1064floatfactor=((float)newSize)/oldSize;……1067}}死循环结构模式(DLF)例子要分析控制循环的变量的开始条件、结束条件、步长变化,检查该循环能否结束,若不能则会形成死循环。(1)无增量或增量与结束条件无关【例8.5】for(i=1;i<=100;j++);(2)无结束条件【例8.6】for(i=1;i++);(3)增量的变化趋势不能使循环结束【例8.7】for(i=1;i==100;i=i+2);资源泄漏故障(RLF)例子资源泄漏故障:在Java程序中,当一个资源被打开后,如果并不是在所有的可执行路径上都对其进行了显式的释放操作,则是一个资源泄漏故障。【例8.8】FileOutputStream函数缺少close()。

staticvoidcopy(InputStreamin,StringfileName)throwsIOException,FileNotFoundException{byte[]buf=newbyte[1024];FileOutputStreamout=newFileOutputStream(fileName);intnRead;while((nRead=in.read(buf,0,buf.length))!=-1)out.write(buf,0,nRead);}竞争条件(RaceCondition)如果程序中有两种不同的I/O调用同一文件进行操作,而且这两种调用是通过绝对路径或相对路径引用文件的,那么就易出现竞争条件问题。【例8.11】下列程序:1voidremove_if_possible(char*filename){2 if(access(filename,0))3 remove(filename);4}access()和remove()之间造成的竞态条件,很明显当这两个操作在同一个函数中,并且用的是同一个路径,就会产生竞争条件。风险操作(RiskOperation)如果不恰当地使用了某些标准库函数,可能会带来安全隐患。甚至在某些情况下,某些函数一经被使用,就可能会带来安全隐患。【例8.12】下列程序:1voidfunc(){2 …3 longseed1=rand()+datetime();4 mdsetseed(seed1);5 …}上面的代码会造成一个安全漏洞,因为seed1这个随机数将用于一个与密码相关的进程。34本章内容高质量程序代码代码缺陷静态分析技术静态分析工具静态分析技术静态分析技术是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术35图:

静态分析工作方式36静态分析技术抽象解释符号执行模型检测定理证明类型推导约束求解基于缺陷模式的测试37抽象解释抽象解释理论是关于对程序进行静态分析时构造以及逼近程序不动点语义的理论,于1977年由P.Cousot和R.Cousot提出,其分析过程是用一个构造的抽象域上的计算替代程序具体域上的计算,并使抽象计算的结果能够反映分析目标所关心的程序实际执行信息。抽象解释理论本质上是均衡了分析效率与分析精度,并以损失分析精度的代价换取分析可行性,再通过迭代分析以增强分析精度的一种抽象逼近方法。抽象解释理论是静态分析技术的基础,可从理论上验证静态分析的是否可靠。基于抽象解释理论的形式化静态分析方法是对大规模硬件与软件系统进行自动化分析与验证的有效手段之一,目前已被广泛地应用于大型硬件与软件系统的分析与验证研究中。P.Cousot等基于Galois连接的抽象解释理论框架开发了静态分析工具ASTREE,已成功地对嵌入式软件进行了分析。该类工具在理论上能够达到对某些程序静态属性测试的可靠性,但要求被测程序具有良好的形式化,而且效率较低。38符号执行符号执行的基本思想是,用抽象的符号表示程序中变量的值,来模拟程序的执行。该方法很好地克服了在静态分析时不能确定程序中变量值的问题,常常在对路径敏感的程序分析中使用。符号执行通常是结合约束求解对程序进行分析,这样可以精确模拟程序的执行。因为符号执行跟踪了程序中变量的所有可能取值,因此该方法能够发现程序中各种逻辑错误。但是在应用该方法对大程序进行处理时,可能会因为程序规模的增大导致程序执行的可能路径数目呈指数级增长。为避免路径膨胀需要对路径进行选择,选取一部分具有代表性的路径进行分析。PREfix39模型检测模型检测是一种验证具有有限状态的并发系统的方法,基本思想:先对具有有限状态的系统构造有向图或者状态机等抽象模型,再对抽象模型进行遍历以验证系统的某些性质。模型检测时,首先将一个代表某一系统行为的状态转换模型M和一个代表需要检查的属性P作为输入,然后尝试遍历M中所有的路径,并在每个可能到达的状态检查属性P是否满足。模型检测的难点在于构建模型以及避免状态空间爆炸。SLAM与BLAST40定理证明定理证明是一类基于语义的程序分析技术,主要应用于程序验证。对一个程序P和一个规格说明S,满足该程序的验证条件就是表达式VC(P,S),该表达式为真当且仅当程序P符合规格说明S,可用定理证明器验证VC(P,S)的真假,但是采用了消解原理的定理证明器通常并不适合于程序分析,因为该技术对有理数域、整数域的运算的处理不太方便。在这种情况下,人们常用各种判定过程来判别公式是否为定理。ESC41类型推导类型系统是一种发展完善的轻量级的形式化方法。其基本思想是由机器自动地推导出程序中变量和函数的类型;根据所计算出的值的种类,将词语分为不同的集合,把每一个集合作为一种类型,利用类型理论中的一些算法进行分析,进而证明某些程序行为不会发生。例如,程序可被抽象为一个图,图上的各节点通过加数据流和控制流的边相连,图中的任一节点都包含了计算出变量的值,若依据一定的规则对节点进行分组,每一组就是一个类型,这样就可以对程序中指针变量的别名等问题进行处理。ESP42约束求解约束求解问题也被称为约束可满足性问题,可以用一个三元组<V,D,C>形式化地描述一个约束问题,其中V为变量集合,D为变量的域集,C为约束。变量Vi只能在它的域Di中取值,C描述变量间必须满足的约束。约束求解也就是在各变量的域中求解除一个或多个值N,以满足各变量间的约束C。基于约束求解的程序分析技术是基于程序的语义将程序代码转化为一组约束,并通过约束求解器得到满足这些约束的解。约束求解技术在程序静态分析领域中的主要应用是测试用例生成,不过目前在程序缺陷检测领域也有广泛应用,对于可能的缺陷检测点,假定会产生一个缺陷,然后验证是否有满足缺陷产生的可能。43基于缺陷模式的测试缺陷模式是指程序中经常发生的缺陷所呈现出的语法或语义特征,如空指针引用、内存泄漏、数组越界等,基于缺陷模式测试的出发点并不是要验证程序,而是要检测出程序中潜在的缺陷。该技术与上述几种静态分析技术不同之处:它首先定义软件的各种缺陷模式M={M1,M2,…,Mn},等;测试时根据Mi,通过遍历源代码中的路径来静态地分析代码,从源代码中计算出与Mi相匹配的程序元素IP1、IP2、…、IPi,即可疑故障点。基于缺陷模式的典型工具包括FindBugs、Klocwork、Coverity等。该类工具具有效率高、易于使用的特点,缺点是难以保证检测的完备性和可靠性。44本章内容高质量程序代码代码缺陷静态分析技术静态分析工具DTS整体分析流程45DTS技术原理46缺陷测试系统(DTS)测试案例上海证券交易所天津银行北京农商行47

DTS对天宫1的测试效果在北京航天飞行测控中心:测试6个软件(67252行),发现:故障18个安全缺陷7个疑问代码81个规则缺陷106个西安卫星测控中心:测试6个软件(90186行),发现:故障45个安全缺陷39个疑问代码371个规则缺陷455个DTS对神舟7的测试效果软件来源软件名称文件数目文件长度IP数目故障数目软件类型神舟7项目120179K70C++神舟7项目266822K383(内存泄漏)C++神舟7项目387207K180C++神舟7项目481891K453(内存泄漏)C++神舟7项目520227K233(2个内存泄漏+1个未初始化)C++神舟7项目629253K914(1个内存泄漏+3个未初始化)C++神舟7项目723227K

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论