您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 软件可靠性安全性技术
1软件可靠性安全性技术2几个基本术语故障(Fault)差错(Error)失效(Failure)缺陷(Defect)失误(Mistake)隐错(Bug)3软件质量的一个示例在一段VisualBasic6.0编写的程序Division中,从文本框1中输入数A#,从文本框2中输入数B#,计算C#=A#/B#从文本框3中输出,其程序如下:PublicA#,B#,C#PrivateSubDivision()A#=Val(Text1.Text)'从文本框1中输入B#=Val(Text2.Text)'从文本框2中输入C#=A#/B#Text3.Text=Str(C#)‘从文本框3中输出EndSubA#=1,B#=0时结果如何?exam14软件可靠性软件可靠性:在一定条件下软件实现所要求功能的能力。关于软件可靠性的误区:软件对一组条件下的运行,如果是对的,则永远是对的,何有可靠性?对软件可靠性误区的回答:对已认为满足了功能和性能要求的软件,为何有的软件在实际的运行中会经常出错?追其原因都是对运行中异常的操作、输入、事件无防范处理措施,诸如人机交互界面软件对误操作经常死机,通讯软件对外界干扰经常瘫痪等,这能说不是软件可靠性的问题吗?5软件可靠性的一个示例前面的exam1就是一个示例。我们再给一个示例。用VisualBasic编写一个读入给定数据文件的程序。用户输入的文件名存放在text1.txt中,数据文件格式是:第一个数是整型数N(表明以下存放了N个浮点数),后续以空格、逗号或换行为区分符存放N个浮点数。OpenFile()子程序完成将数据文件中的N个浮点数读出存放在变量数组A#()中。6PrivateSubOpenFile()Dimi,NOpenTrim(Text1.Text)ForInputAs#1'打开数据文件Input#1,N'读入数据个数ReDimA#(1ToN)Fori=1ToNInput#1,A#(i)'读入数据NextClose#1'关闭数据文件EndSub文件不存在或数据格式错误时结果如何?exam27软件安全性软件安全性:对由于软件的缺陷造成人员伤亡、财产损失等危险事件的防范能力。关于软件安全性的误区:软件只是代码程序和相应文档,软件结果只是对与错,何有安全性?对软件安全性误区的回答:对实时嵌入式软件而言,软件的指令直接控制着硬件的动作,如果软件不对所控制硬件的指令进行安全性保护,有何信心保证系统是安全的?由于软件的错误造成重大财产损失、严重人员伤亡的实例已屡见不鲜,这能说软件没有安全性的问题吗?8软件安全性的实例转塔设备的调转控制……9软件可靠性安全性设计准则10软件可靠性和安全性设计的一般性指导可参考GJB/Z102-1997软件可靠性和安全性设计准则Q/WE871-1999软件可靠性和安全性设计指南二院制定的《武器系统软件可靠性安全性设计准则》,则是结合二院以往地空导弹武器系统软件中实际暴露的典型问题,总结整理归纳出的有关软件可靠性和安全性设计的具体细则,适用于二院武器系统软件开发中可靠性和安全性的设计。114.4圈复杂度的限制“圈复杂度”(CyclomaticComplexity)反映的是软件模块本身内在的结构复杂度。ABCDEFHIJG12435结点边区域记:结点数N,边数E,区域数RG,圈复杂度C。则C=E–N+1=RG+1上图中,N=10,E=14,所以RG=4,C=5。在软件单元测试时,希望能选定最少的测试用例覆盖所有路径,这需要确定模块中的独立路径数,“圈复杂度”就是其独立路径数。如在上图中,C=5,其五条独立路径分别为:ABCEGJ,ABCEFIJ,ABCEFHJ,ABCDJ,ABCDDJ。做为软件模块的“圈复杂度”原则上要求不超过10。12圈复杂度问题的示例圈复杂度115的控制流图圈复杂度10的控制流图134.5余量的设计应注意关键软件的余量设计,这些余量包括:存储量、IO通道吞吐量及处理时间等。在同步时间要求较高的系统中,处理时间的余量应不少于20%。如,某系统9ms通讯一次,则该系统的处理时间应小于7.2ms。余量设计为我们在软件测试时使用一些在线动态测试工具,如CodeTest等,提供了必要的应用条件。144.9.1谨防实数取整的精度损失实数取整的转换函数int()在C中是截取取整的,如果需要四舍五入,则必须特殊处理。例如:floatf=1.9;intk;k=(int)(f);则k是1,而不是2。15实数四舍五入后取整的方法如果f=0,则int(f+0.5)是四舍五入后的取整结果;如果f0,则int(f–0.5)是四舍五入后的取整结果。164.11安全关键信息码的设计安全关键的信息码应采用具有检错能力的编码。禁止对关键信息用一位的逻辑判别,如用“0”来表示“不起飞”,用“1”来表示“起飞”。对此具有检错能力的编码可以为用二位的逻辑判别,如用“01”来表示“不起飞”,用“10”来表示“起飞”。显然在有一位可能受干扰的系统假设下,用一位的逻辑判别无法检测其是否受干扰,而二位的逻辑判别则可以检测其是否受干扰,如“00”和“11”就表示信号受到了干扰。17安全关键信息码应用的实例操作杆的误信号……184.10异常计算的防范设计在数值计算中,要充分考虑计算中的异常情况,如:(1)在除法计算中,要考虑除数为0或很小时的计算溢出的处理,可计算前先进行除数大小的判别检查;(2)在开平方根的计算中,要考虑被开根数是否大于等于零,可计算前先进行被开根数的符号判别。19异常计算设计问题的实例一有效视线角误差……20异常计算设计问题的实例二……214.13接口数据的定义在通讯接口数据定义时必须明确通讯的数据量、数据格式、数据内容、换算要求、传输协议、传输率、误码率。(1)初始状态要设计为0位状态。如,“00表示状态未定”即应为初始状态。又如,用2位表示的:“01表示状态1”、“10表示状态2”、“00表示状态未定”,和用1位表示的:“0表示状态1”、“1表示状态2”,对初始状态的理解是不一样的。22(2)对交换字各位解释说明其含义时,单一位的解释说明,不仅要说明为“1”的含义,还要说明为“0”的含义;多位解释说明时,不仅要说明特定组合的含义,还要说明其它组合的含义。如2位组合的含义解释说明时,不仅要说明“00表示状态未定”、“01表示状态1”、“10表示状态2”,还要说明“11”表示何含义(可能是无意义,但要明确说明,有些是不需要处理而保持以前状态,有些是要进行报警或异常错误处理的)。234.15异常处理的设计对软件的编程不能只考虑正常情况下的处理,还应充分考虑可能的异常事件的处理。在软件的设计过程中应专门对可能的异常事件进行分析,这一工作称之为“软件失效模式及影响分析”。24如,在对数据文件操作时可以考虑的异常事件有:(1)错误的文件名或文件数(2)文件没找到(3)错误的文件模式(4)文件已经被打开(5)I/O设备错误(6)文件已经存在(7)错误的记录长度(8)磁盘满(9)超过文件结尾的输入(10)错误的记录数(11)错误的文件名(12)太多的文件(13)设备不可使用(14)权限不允许(15)磁盘没准备好(16)不能对不同设备重新命名(17)路径或文件访问错误(18)没找到路径25显然这18种模式无需也不必都考虑,可依据实际情况裁剪考虑。如在人机交互软件中用户选择数据文件,则“错误的文件名或文件数”、“文件没找到”和“路径或文件访问错误”是必须要考虑的,需要对此设计相应的处理方法。如果是具有运行错误陷阱功能的高级语言,如:VB、VC、Ada等,则错误陷阱的使用是很好的方法。无可靠性措施的软件:如当输入的文件不存在时,软件运行被异常终止。用户不知所措,甚至连相关信息都没得到。软件失控了!有可靠性措施的软件:如当输入的文件不存在时,软件提示《输入文件不存在》的信息,并重新返回到用户输入状态,等待用户终止输入过程,或重新输入。软件始终处于受控!exam3264.17变量的命名变量命名要清晰。通常的命名有头字母大写命名法和下划线命名法。头字母大写命名法如:InitialValue,ObjectPosition等。下划线命名法如:initial_value,object_position等。现在又流行带类型说明的头字母大写命名法:如intInitialValue表明是int的类型,flObjectPosition表明是float的类型,而用tempInitialValue来表明其是一个临时变量。变量的命名对程序的理解及维护起着非常重要的作用。27变量命名问题的实例for(tchflag=0;tchflag14;tchflag++)……284.19变量的初始化所使用的变量要有明确的初始化,避免使用缺省的初始值。同时,对循环处理过程的变量初始化要特别注意。29变量初始化问题的实例一固化与非固化的差异……30变量初始化问题的实例二双发时的过程标志……314.21多组条件判别的完全性C语言中的IF语句推荐的书写格式为if(id==0){//0的处理;}elseif(id==1){//1的处理;……}else{//其它情况的处理;}注意这里else要求明确写出,要充分利用else进行异常情况的处理。事实上,if处理条件的遗漏是经常发生的,需要特别小心。32多组条件判别不完全性的实例if(mo0&&mo11&&no0&&no10){…}if(mo1||mo11)mp(5);if(no1||no10)mp(6);if(mo0&&mo11&&no0&&no10){…}elseif(mo1||mo10){mp(5);}elseif(no1||no9){mp(6);}else{//此处进行提示报告}334.22函数调用返回的设计函数的返回必须要有运行状态的标识,以使调用者能识别被调函数的运行状态。34函数调用返回设计的示例方法一:可以设置整型函数的返回值,以标识函数的运行状态。如计算三角形面积的函数可设计为:intTriangleComp(floata,floatb,floatc,float*s){if(……){//正常时的计算,面积值赋给*s……return(0);}elseif(……){//出现边长小于零的情况return(-1);}elseif(……){//两边之和小于第三边的情况return(-2);……}else{//其它情况return(-10);}}intflag;flag=TriangleComp(3,4,5,&s);if(flag0){……//异常处理}else{……//正常处理}在调用时可以进行判别35方法二:可以在调用参数中专门设计一个函数运行状态的参数。如上述计算三角形面积的函数也可设计为:floatTriangleComp(floata,floatb,floatc,int*e){floats;if(……){//正常时的计算,面积值赋给s返回*e=0;return(s);}elseif(……){//出现边长小于零的情况*e=-1;return(0);}elseif(……){//两边之和小于第三边的情况*e=-2;return(0);}else{//其它情况*e=-10;return(0);}}inte;floats;s=TriangleComp(3,4,5,&e);if(e0){……//异常处理}else{……//正常处理}在调用时可以进行判别364.23函数调用参数的匹配函数调用的参数类型、次序和个数必须匹配。类型的匹配一是注意int、float、double、char等类型的匹配,二是注意指针地址和地址内容的匹配。如,intfunc(float*)的函数,直接调用func(0),则func使用的是0地址单元中的值,而非0值,如要送0值则应先申请“floatangle=0;”再调用func(&angle)。37函数调用参数匹配问题的实例回路测试……384.28对GOTO语句的限制原则上限制使用跳转(GOTO)语句,在使用GOTO语句能带来某些好处
本文标题:软件可靠性安全性技术
链接地址:https://www.777doc.com/doc-1269694 .html