《软件安全-软件安全的架构和设计.ppt》由会员分享,可在线阅读,更多相关《软件安全-软件安全的架构和设计.ppt(133页珍藏版)》请在三一办公上搜索。
1、第四章 软件安全的架构和设计,4.1 软件设计基础4.2 面向对象程序设计4.3 软件架构和设计过程中的风险分析 4.4 安全原则、安全方针,4.1 软件设计基础,在进行了系统需求分析后,就定义了软件系统实现的目标,这个阶段也称为软件的定义阶段,接着就进入了系统开发的中心阶段软件设计阶段。一般的设计是应用各种技术和原理,对设备、过程、或系统作出足够详细的定义,使之能够在物理上得以实现。软件设计阶段是软件生命周期的中心,它的任务是将软件的需求描述或定义转换成软件的具体设计方案,并且要考虑对实现环境的要求,使之能够在物理上建成一个符合用户要求的软件系统。,4.1.1 软件设计概念,人们经过多年的实
2、践,总结和发展了许多软件的设计概念和经验,成为软件设计人员设计复杂应用问题时应该遵循的基础。我们前面已经学习了需求分析,明确了用户的需求,但那都是软件的需求,而不是软件(也可以说是从用户角度描述,而不是从软件开发人员角度描述问题),这一节就是要将计算机软件需求变为软件表示,那么什么是软件表示?如何实现这一变换?这是这一节要解决的主要问题。,软件需求:解决“做什么”软件设计:解决“怎么做”,1 软件设计划分的形式:,(1)从设计步骤上看可分为总体设计(初步设计)和详细设计:软件设计是将软件需求变换成软件表示的过程,最初这种表示只是描述软件的总体框架,称为软件的总体设计,然后进一步细化,在框架中填
3、入细节,将各模块的具体设计表示成在细节上接近于源程序或易于用源程序实现的形式,称为详细设计。(2)从软件工程管理的观点上看可分为概要设计和详细设计两个部分:概要设计是将软件的需求转化为数据结构和软件的系统结构;详细设计是软件结构表示的细化,得到软件的详细数据结构表达和具体算法描述。,1 软件设计划分的形式:,(3)从设计的技术内容上看可分为数据设计、结构设计和过程设计:从信息流技术包含的设计内容上看,软件设计是根据软件的功能、性能需求和用户其它要求,采用某种设计方法进行数据设计、系统结构设计和过程设计。数据设计侧重于数据结构的定义,系统结构设计侧重于定义软件系统各主要成分之间的关系,过程设计则
4、是把软件结构成分转换成过程性描述。,2 概要设计的内容:,(1)制定规范:为软件开发的设计小组制定软件设计时应该共同遵守的标准,便于协调小组内各个成员的工作。包括:阅读和理解软件需求说明书,确定用户需求的实现条件和设计目标、设计的优先顺序等;根据设计目标确定合适的设计方法;确定设计文档的编制标准(如:文档体系、样式、记述的详细程度、图形的画法等);规定编码(代码)体系的信息形式,与硬件、操作系统及其它软件的接口规约、命名规则等;,2 概要设计的内容:,(2)软件结构的总体设计:从系统开发的角度看,需求分析已经完成了部分功能设计,即将系统按功能进行了逐层分解,使每一部分完成简单的功能,且各个部分
5、又保持一定的联系,还要把该层次结构的各个部分组合起来形成统一的系统。包括:采用某种设计方法,将一个复杂的系统按功能划分为模块的层次结构;确定各个模块的功能,建立模块与功能的对应关系;确定模块间的调用关系和接口(模块间传递的信息)关系;设计接口的信息结构;评估模块的划分质量,导出模块结构规则;,2 概要设计的内容:,(3)处理方式设计:确定外部源点与终点输入/输出接收与发送的形式:根据外部数据源点终点的特性,确定合理的数据接收与发送的形式;确定实现系统功能所需的算法,评估算法的性能;确定为满足软件系统的性能所必需的算法,确定模块间的控制方式,满足以下指标:周转时间从计算机接收请求的输入开始,经过
6、处理直到输出结果为止的整个时间;响应时间对于联机实时系统的性能要求,当终端用户向计算机发出处理请求之后,从一次输入开始到一次输出最终结果之间的一段时间;吞吐量单位时间内能够处理的数据量,表示系统的处理能力;精度进行数学计算时,对运算精确度的要求;,2 概要设计的内容:,(4)数据结构设计:确定软件涉及的数据文件系统结构及数据库模式、子模式和进行数据完整性和安全性设计,包括:数据文件的详细数据结构;确定算法所需要的详细逻辑数据结构和操作;确定对数据结构必需进行操作的程序模块,确定和尽可能限制各个数据操作模块和设计决策所涉及的影响范围;确定系统调用的详细数据结构和使用规则;进行数据的保护性设计:包
7、括防卫性设计,进行自动检错、报错和纠错设计,进行一致性检查设计,保证软件运行过程中所使用的数据类型和取值范围不变;在并发处理过程中使用封锁和解除封锁机制保持数据不被破坏;进行一定的数据冗余设计,保证软件系统有一定的容错性;,2 概要设计的内容:,(5)可靠性设计(质量设计):在使用计算机的过程中可靠性是很重要的,可靠性不高的软件,其质量也不高;确定软件可靠性的指标和其他质量指标,使软件易于适应环境的变化和用户的新要求,易于进行修改和维护;(6)编写设计阶段的文档:编写系统概要设计、数据设计文档,编写用户手册和指定测试计划,对测试提出明确要求;(7)进行设计审查和复审:审查设计方案的正确性,根据
8、设计文档进行评估,选择合理的或推荐最佳的设计方案,并从管理角度进行复审,检查是否符合设计规范和设计步骤,同用户方一起,确定合理的优选设计方案。,概要设计中,最主要的工作是系统总体结构的设计,简称总体设计。其他设计工作可随总体设计工作的过程逐步确定。,4.1.2 模块独立性、耦合性与内聚性,软件被划分成若干个可单独命名和编址的元素称为模块,模块是数据说明、可执行语句等程序对象的集合。例如:子程序、过程、函数、宏、数据说明等都可作为模块。这些模块按一定形式组成整体以满足软件系统指定的要求。,1 模块的独立性:,模块的独立性是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其他模块的
9、接口尽可能地简单,模块的设计应该使模块之间仅有必要的联系,没有过多的联系,一个模块的存在不依赖于另一个模块的存在。一般采用两个定性准则评价模块的独立性:模块本身的内聚和模块之间的耦合。耦合越高,模块间的联系就越多,模块独立性就越低;内聚越高,模块内的各个元素联系就越紧密,与其它模块之间的联系相应地会减少,模块独立性就越高。因此,模块独立性高的应该是那些高内聚低耦合的模块。,无耦合没有依赖关系,松散耦合有少量依赖关系,紧密耦合有很多依赖关系,2 模块间联系的形式耦合性:,耦合性是软件结构中各个模块之间相互关联的度量,它取决于模块调用的方式、各个模块之间接口的复杂程度、以及通过接口的模块信息的性质
10、和方式。模块间的耦合性划分为以下七种形式:(1)非直接耦合(也称为偶然性耦合):两个模块之间没有直接的联系,它们的联系完全是通过上层模块的控制调用来实现的,这种模块之间的联系形式,模块的独立性最强;(2)数据耦合:模块之间仅有必不可少的数据参数传递,而不是通过控制参数、公共数据结构或外部变量来交换信息,这样的模块之间的联系接口简单、安全可靠,是一种松散的耦合形式;,(1)无直接耦合,模块1,模块2,模块3,模块6,(2)数据耦合举例,开发票,计算水费,单价数量,金额,(3)标记耦合(也称复合耦合):模块之间不是用简单变量,而是共用某种数据结构的部分或全部信息,并按该结构特点和要求对信息进行操作
11、,这些模块必须清楚该数据结构的形式和特点才能使用。这种耦合使操作复杂化了,如果将数据结构上的操作集中于一个模块内,就能消除这种耦合;(4)控制耦合:模块之间相互传递控制变量,如:开关、标志数据、名字等控制信息,明显地对模块进行选择、控制,实质是利用一个接口选择多功能模块的某项功能。对控制、被控制模块的修改都会相互发生影响,增加了编程和理解的复杂性,降低了模块的独立性;,标记耦合举例,计算水电费,计算水费,计算电费,住户情况,水费,电费,住户情况,“住户情况”是一个数据结构,图中模块都与此数据结构有关.“计算水费”和“计算电费”本无关,由于引用了此数据结构产生依赖关系,它们之间也是标记偶合.,将
12、标记耦合修改为数据耦合举例,计算水电费,计算水费,计算电费,本月用水量,本月用电量,水费,电费,控制耦合举例,A,计算平均分或最高分,B,平均/最高(控制信号),成绩,读入分数,输出结果,计算平均分,计算最高分,平均/最高?,B,控制耦合增加了理解和编程的复杂性,调用模块必须知道被调模块的内部逻辑,增加了相互依赖,去除模块间控制耦合的方法:(1)将被调用模块内的判定上移到调 用模块中进行(2)被调用模块分解成若干单一功 能模块,改控制耦合为数据耦合举例,A,计算平均分,B1,平均成绩,最高成绩,计算最高分,B2,(5)外部耦合:一组模块都访问同一个特定的外部数据块,受外部环境的制约,如:访问外
13、部变量名、共用通信协议、共享外部I/O资源,共享缓冲区等,这些模块之间的耦合成为外部耦合;(6)公共偶合:一组模块都访问同一个公共数据环境,共用全局数据区、内存覆盖区等,形成了公共耦合;它的复杂程度随着耦合模块的个数而迅速增加,应尽量避免这种高强度耦合的使用;(7)内容耦合:两个模块之间如果有下列情形之一,就发生了内容耦合:一个模块与另一个模块的内部代码重叠在一起;一个模块访问了另一模块的内部数据;一个模块不通过正常入口转移到另一模块的内部;一个模块有多个入口,容易从不同的渠道进入;这种耦合是最高程度的耦合。,公共耦合举例,公共数据区,C,B,模块A、B、C间存在错综复杂的联系,(1)软件可理
14、解性降低(2)诊断错误困难(3)软件可维护性差,(6)软件可靠性差(公共数据区及全程变量无保护措施),公共耦合存在的问题:,慎用公共数据区和全程变量!,(7)内容耦合,一模块直接访问另一模块的内部信息(程序代码或数据),最不好的耦合形式!,A,B,A,B,模块代码重叠,Entry1 Entry1,多入口模块,以上七种耦合程度由强到弱的排列顺序为:内容耦合、公共耦合、外部耦合、控制耦合、标记耦合、数据耦合、非直接耦合。模块化设计的目标是希望建立模块间尽可能松散的系统,有利于系统的设计、编码、测试和维护,减小各个模块发生错误时的影响范围,集中设计、维护人员的主要精力,增加系统的可维护性。,耦合强度
15、依赖的因素:一模块对另一模块的引用一模块向另一模块传递的数据量一模块施加到另一模块的控制的数量模块间接口的复杂程度,模块间耦合性的强弱也取决于两个模块间接口方式和接口数据的复杂性,接口的复杂性和模块间的耦合性关系如下:,如何降低模块间耦合度:,(1)尽量使用数据耦合少用控制耦合限制公共耦合的范围坚决避免使用内容耦合,(2)降低接口的复杂性,小结,因此,模块设计时应该通过模块调用来使用其它模块,不应该转入模块内部直接引用另一模块的内部信息,模块间传送的参数最好做数据传送,尽量减少使用或有控制地使用共用数据区信息和全程变量,模块间的接口尽可能的简单,减少联系的复杂性,提高模块的独立性,可以提高设计
16、软件的质量。,3 模块内部的联系形式内聚性:,内聚性是度量一个模块内各元素彼此结合的程度。如语句之间或程序段之间的联系。内聚性强,标志着模块的独立性强,内聚性弱,标志着模块的独立性差。内聚的程度取决于模块内各元素结合的形式,一般将内聚分为七种形式:(1)偶然内聚(也称为巧合内聚):模块内各部分元素间没有联系或没有直接的联系,就象偶然放在一起的联系形式,这种内聚性程度最低,往往是程序员为了节省内存,减少程序长度,将一些没有任何联系的、可能在许多模块中重复的语句堆放在一个模块内而形成的,这种模块的缺点是不易修改和维护,不易理解,增加了程序的模糊性,割裂了程序的完整逻辑,增加了出错的可能性;,(1)
17、偶然内聚(巧合内聚),模块内各部分间无联系,A,B,C,M,MOVE O TO RREAD FILE FMOVE S TO T,模块M中的三个语句没有任何联系缺点:可理解性差,可修改性差,例:,(2)逻辑内聚:把几种相似的功能组合在一个模块内,调用时由传送的判定参数或开关参数来控制应执行那一种功能。它表明了模块内各部分的相关关系,有多种可供选择的功能,调用时需要由传递的参数控制,增加了模块间的耦合强度,不易修改,降低了系统的效率;,逻辑内聚模块,A,B,C,E,F,G,A,B,C,EFG,E、F、G逻辑功能相似,组成新模块EFG,缺点:增强了耦合程度(控制耦合)不易修改,效率低,(3)时间内聚
18、(也称经典内聚):软件运行时,有几个操作和处理需要在同一时间段内执行完成,这种内聚称为时间内聚。例如:对软件系统变量设置初值、设置文件的初始状态、现场状态的保护、系统终止时的操作,一般具有这种内聚的模块内各部分可以按任意顺序执行,内部逻辑较简单,判定较少,内聚程度稍高一些;例如:初始化系统模块、系统结束模块、紧急故障处理模块等,(4)过程内聚:模块内的各个处理是相关的,必须以特定的次序执行,模块内各部分具有的内部联系,象一个过程体一样。如统计数据时,先设置统计变量的初值,读入数据,接着进行数据统计和累加,并判断统计完成与否,由判定结果决定是否继续循环执行,循环、判定、计算这三部分是过程内聚,属
19、于中等强度的内聚,比较好理解和易于维护;,过程内聚模块,读入成绩单,审查成绩单,统计成绩,打印成绩,读入并审查成绩单,统计并打印成绩单,(5)通信内聚:模块内的各部分为完成功能都使用了相同的输入数据,或产生了相同的输出数据,这样的内聚形式属于中等强度,一般使用相同的输入输出缓冲区。如:打印表格时,需要读入文件、计算数据、打印多张表格的处理过程,不同的计算数据部分使用了相同的输入数据,这些计算数据部分之间的联系为为通信内聚的形式;,通信内聚模块例,产生工资报表,计算平均工资,职工工资记录,职工工资报表,平均工资,产生职工工资报表并计算平均工资模块,(6)顺序内聚:模块内各个部分的执行次序,是按指
20、定的顺序执行的,不能任意改变。往往前一功能成分的输出,就是后一功能成分的输入,这些功能成分与同一功能密切相关。如:读入数据、计算累加值,这两个功能成分密切相关,顺序不能颠倒,属于顺序内聚;(7)功能内聚:一个模块内的各部分成分是为完成某一具体功能必不可少的组成部分,或者说模块内的各个部分都是为完成某一具体功能而协同工作,紧密,联系,不可分割,这种模块内的联系成为功能内聚。这样的模块内聚程度最高,易于理解、修改和维护。,模块的内聚性类型,低 偶然内聚 0分 逻辑内聚 1分 内 时间内聚 3分 聚 过程内聚 5分 性 通信内聚 7分 顺序内聚 9分 高 功能内聚10分,模块独立性,弱(功能分散),
21、强(功能单一),小结:,内聚性和耦合性是密切相关的,高内聚性的模块往往是低耦合性的模块,但也有例外,而高耦合性的两个模块必然是低内聚性的模块。在一个软件系统分解成模块的时候,尽可能使分解的模块之间具有较低的耦合性,尽量用较高内聚性来确保模块的独立性,进行软件模块结构的设计,有利于程序的编写、调用和控制,也使得各模块的独立性更强。,4.1.3 软件设计的基本原则,(1)模块化原则:模块化就是采用抽象和分解的方法,按一定原则把软件划分成多个模块,每个模块完成一个子功能,将复杂的软件设计转换成相对简单的模块设计的过程;(2)抽象是人类认识复杂现象的思维工具,现实世界的一定事物、状态、过程间总是存在着
22、某些相似的方面共性,把这些共性集中概括,暂时忽略它们之间的差异的细节,提取共同的性质进行描述,就是抽象;(3)信息隐蔽原则:应该使分解得到的每个模块内包含的信息(如过程和数据)对于不需要这些信息的模块来说,是不能访问的,即进行模块的信息隐蔽;,(4)局部化原则:局部化就是把一些关系密切的软件元素物理地放得很近。如:在模块中使用局部化数据元素,有助于进行信息隐藏。有助于避免错误的传播,易于进行软件的维护;(5)模块独立性原则:模块的划分和设计,应尽可能保持独立。即:模块应该完成独立的功能,包含模块完成单一功能在内;模块间相互依赖的程度尽量要低;符合信息隐藏和信息局部化。它是模块化、抽象、信息隐藏
23、、信息局部化的直接产物;,(6)其它原则:软件工程强调软件开发过程的规范化和统一,要求软件系统的定义具有一致性:即各个元素使用统一、一致的符号,没有不必要的差异;对操作有一致的控制结构和调用序列;任一抽象层次中逻辑相关的对象表达是相同的结构形式;软件系统的完整性:系统内所有抽象成分的本质内容都明显地定义或描述了,没有本质的特性被遗漏,即保持系统的完整性,不丢失重要的特性;软件系统的确定性(可验证性):软件分解时应保证所有软件成分能够容易进行测试,定义应该是确定的,不存在二义性。,4.1.4 模块划分的启发性规则,(1)模块的大小要适中,易于模块的设计、阅读与理解,一般每个模块在保证完成系统功能
24、的前提下,模块大小为12页(60100行源程序)为好;(2)软件结构的特性参数要适当,即软件结构的深度、宽度、扇入、扇出数都应适当。深度表示软件结构纵向的控制层数,一般要求中规模软件小于等于10,小规模软件在57间,大规模软件可达几十,客观上深度初略地表示了软件的复杂程度。宽度表示软件结构同一层内模块数的最大值。一般在425,宽度越宽表示软件越复杂。扇出是一个模块直接调用和控制的模块数,一般在39间。太多时可通过增加中间层来减少扇出数。扇入是一个模块直接调用与控制的上级模块数,一般在15间,扇入数太多时,同样可用增加深度的方法来减少扇入数;扇入、扇出与宽度相关,而调整中又涉及到结构深度的改变。
25、因此软件结构特性的参数应适当,并与模块的独立性原则一致;,参数举例:深度:5 宽度:5A的扇出:3 M的扇入:3,(3)模块的接口尽量是单入与单出口,避免出现模块的内容耦合,降低接口成本,也有利于软件的理解和维护;(4)保证模块的功能可以预测,即当有确定的输入时,不论模块中的具体实现路径如何,应该有确定的可预期的输出结果,有利于进行软件的测试;,(5)模块的作用域应在模块的控制域之内,减弱模块间的耦合。作用域是指受该模块影响的所有模块,即直接调用的模块数;控制域是指受这个模块直接和间接控制调用的模块数。如果作用域超出范围,就要重新划分与调整,作用范围通常通过判定而影响的,判定的作用范围应在该判
26、定所在的模块控制范围之内,判定所在的模块应与受判定影响的模块在层次上尽量靠近;,4.1.5 软件的结构化设计方法,软件的结构设计目前使用最为广泛的方法仍然是美国IBM公司W.Stevens,E.Yourdon,G.Myers,L.Constantine等人提出的结构化设计方法(Structured DesignSD),它是自顶向下逐层细化,按模块进行设计和连接的。软件工程的每一步骤都是对软件的抽象层次进行的一次精化,逐步求精、模块化和抽象是紧密相关的,随着软件开发的进展,在软件结构中,顶层的模块控制了系统的主要功能并且影响全局;底层的模块完成一个具体的处理,用自顶向下由抽象到具体的方式分配控制
27、,简化了软件的设计和实现,提高了软件的可理解性和可测试性,使软件更易于维护。,1 软件结构图,软件结构是指软件的功能层次和分块结构的关系。软件的结构一般有两类形式:层次(树状)结构和网状结构。(1)层次结构:也称为树状结构,通常用层次结构图(树结构图)来表示,各模块之间,除了最顶层模块外,其余模块都有隶属与层次之分,适合于描述具有层次结构的软件系统,它仅仅表示系统中各模块的层次组成关系、调用关系和相互的通信关系,并不表示进程的顺序、判定和重复操作,在数据流和数据结构的描述上,也常用层次结构图来表示。,(2)网状结构:通常用网状结构图来表示,各模块之间无隶属层次之分,是平等关系,也表示了信息通讯
28、关系,如图所示。,(3)一般软件结构图(Structured ChartSC):主要由模块、调用和数据组成,表示模块间的控制、调用关系、相互通信关系,表达了系统模块的结构化的有序组织。模块用矩形框表示,位于上面的模块称为调用模块,下面的称为被调用模块,调用用连线表示,矩形框中带菱形属于判断调用的图形表示,带环状箭头的表示循环调用,一般连线表示一般调用,数据用带有注释的小箭头表示,如下图所示。调用是结构图中模块间唯一的联系方式,它将系统中的所有模块结构化的组织在一起。对于层次结构的软件系统,省去箭头,调用关系也不会错,就变成层次结构图。,图 结构图的基本定义,2典型系统结构图中的基本模块类型:,
29、有四种基本模块类型,见图4-5所示。,图4-5 典型系统结构图中的基本模块类型,(1)传入模块:从下属模块取得数据,经过某些处理后将数据传给上级模块,它传送的数据流叫逻辑输入数据流;(2)传出模块:从上级模块取得数据,经过某些处理后将数据传给下属模块,它传送的数据流叫逻辑输出数据流;(3)变换模块:也叫加工模块,它从上级模块取得数据,经过特定的处理,转换成系统所需的其它形式,再传送回上级模块;(4)协调控制模块:对所有下属模块进行协调和管理的模块,一般在系统结构图中,协调控制模块在较高层出现;实际系统中,有些模块属于上述某一类型,有些模块是上述几种类型的组合,一个模块担当起几种作用。,3 结构
30、化设计方法的主要步骤:,设计步骤为:(1)从软件的需求规格说明中弄懂数据流的流动和加工的过程。(2)根据数据流的流动和加工过程确定问题的类型,针对不同的类型分别进行分析和处理;(3)设计软件系统的初始结构图;(4)改进系统结构图,直到得到符合要求的结构图为止.(5)修改和补充数据词典;(6)制定测试计划。,4.1.6 总体设计的评审,总体设计的评审主要由项目开发的管理机构、质量保证部门的负责人、主要设计人员,与系统分析员和有关专家、用户技术代表共同进行。评审前,需要评审人员仔细阅读设计文档。评审内容包括:(1)完整性:设计是否完整地表达了需求规格说明中规定的软件功能、性能和接口要求;(2)可行
31、性:设计方案中所涉及的技术是否成熟可行;(3)正确性:系统设计的输入、输出之间的关系是否正确、所有外部、内部接口定义是否正确;(4)有效性:关键模块间的联系和关键算法是否有效;(5)一致性:软件设计各部分之间是否存在冲突、不一致处。,4.1.7 详细设计表示法,详细设计(也叫过程设计)是软件设计的具体模块设计阶段,概要设计中的总体设计说明书是详细设计阶段的设计依据与基础。详细设计的根本目标是实现总体设计指定的功能、算法、和外部接口所要求的模块内部数据结构和程序模块的逻辑结构,对每个模块进行详细的算法过程设计,必须用约束性强的方式表达过程的细节,为后续编码阶段提供技术依据。由于这个设计阶段的难度
32、不大,一般程序员可以担任,上层模块、关系到系统整体的整体的关键模块的详细设计由高级程序员来担任。详细设计、编码、模块单元测试都是并行开发,为保证设计质量,应加强设计人员的信息沟通和质量管理。详细设计采用的方法是结构化程序设计方法SP(Structured Programming)。,当前广泛使用的详细设计工具有三类:图形描述、表格描述和详细设计语言描述工具。,图形描述使用图形符号,以绘图的方式描述程序模块的处理过程,有时加有数据描述和存取方法描述。如:程序流程图(PFCProgram Flow Chart)(也称程序框图、程序流图)、盒式程序框图(也称N-S图Nassi-Shneiderman
33、)、Warnier-Orr图、IPO(Input Process Output)图、PAD图(Problem Analysis Diagram)等形式。,下面给出常用的几种代表性的图形工具表示形式:,(1)程序流程图:它用一个方框表示一个处理步骤、一个菱形表示一个逻辑判断、箭头表示程序控制流向。它是使用最为广泛的表达算法过程的描述方法,但也是最容易被错误理解和引起争议的方法。一般含有如下三种基本的构造单元:(P表示判断),P,分支选择结构,Do-While Repeat-Until 循环(重复)结构,图 程序流程图的三种基本结构,这三种基本结构进行组合和层层嵌套,可以表示出复杂的程序逻辑结构。
34、如果随意使用流程图符号,篇幅很长,容易产生误解,使用不当会造成误解。若配合一定的约束和其他描述方法,可以画出结构化构造的程序流程图。,程序流程图的优点是:直观、易学、历史长、使用广泛。缺点是:诱使程序员过早地考虑控制流,容易忽略整体结构;控制流绘制时容易乱转移,破坏结构;不容易表示数据结构;不适于大型程序的设计仅适于小规模程序的设计;例如:折扣率例题,(2)为了克服程序流程图的缺点,改善结构化特性,由Nassi 和Shneiderman提出了盒式程序框图(N-S图),其基本结构图如下:,图 N-S盒式图的基本结构形式,N-S盒式图的特点:功能表达明确,从图上可以直接看出;容易确定局部数据和全局
35、数据的作用域;容易表达模块的层次与嵌套关系;容易培养程序员养成结构化分析问题和解决问题的习惯;没有控制流线,不可能任意转移控制;控制关系隐含、循环次数隐含;实际上是程序流程图去掉控制流线的变种。例题:前面讲到的折扣率例题:,折扣率问题的N-S图,(3)PAD图,它是问题分析图的缩写,1979年由日本日立公司提出的,并得到一定程度的推广,现已为国际标准化组织ISO认可。它用二维树形结构图来表示程序的控制流,易于进行代码的翻译。PAD图设置了五种基本控制结构的图式和三种扩充结构图式,见图所示。其中,P表示判定条件,A、B、S表示应执行的任务。,PAD的扩充结构,为了反映增量型循环结构,在PAD图中
36、增加了对应于FOR I:=n1 to n2 setp n3 do的循环控制结构,如图,其中:n1是循环初值,n2是终值,n3是循环增量。,PAD的扩充结构,另外,PAD图所描述系统的层次关系表现在纵线上,每条纵线表示一个层次。把PAD图从左到右展开,随着程序层次的增加,于可能会超出一页,我们再增加一种结构来处理分页图:,例如:描述一个从1到50的累加和并输出算法的PAD图如下:,实际上PAD图是面向高级程序设计语言的,相对Pascal、Fortran、Cobol等高级程序设计语言,都提供了整套的PAD图式符号,这里不再列出,显然将PAD图转换成与之对应的程序设计语言源代码比较容易。目前,已经有
37、这样的软件,可以直接将我们的PAD图转化为源代码,但是要求必须用标准的格式和符号绘图。,(4)HIPO图,HIPO图是由一组IPO图和一张HC图组成,HC示层次图,用于表是软件的分层结构,HC图中的一个模块,均可用一张IPO图来表示。IPO图使用的基本符号既少又简单,因此很容易学会使用这种图形工具。它的基本形式是在左边的框中列出有关的输入数据,在中间的框内列出主要的处理,在右边的框内列出产生的输出数据,必要时加入数据库。处理框中列出处理的次序暗示了执行的顺序,但是用这些基本符号还不足以精确描述执行处理的详细情况。在IPO图中还用类似向量符号的粗大箭头清楚地指出数据通信的情况。下图是一个主文件更
38、新的例子,通过这个例子不难了解IPO图的用法。,(5)判定表:,在某些数据处理问题中,加工依赖于多个逻辑条件的取值,对应要采取一组动作,这组动作是由一组条件的取值而引发的,这时用判定表来描述较为合适。如:对于采购货物时的折扣率处理用判定表描述如下:,判定表由四个部分组成:条件栏左上部分,列出各种可能的条件;动作栏左下部分,列出可能采取的动作;条件项右上部分,给出各种条件的取值组合;动作项右下部分,指明在相应的组合条件下应采取的动作;实际使用时常常将它们化简或合并,表达更清楚。判定表适用于条件清楚,有较多组合条件的情况,即条件确定的情况,但难于描述重复和条件变化的情况,可以与结构化语言结合起来使
39、用。,(6)判定树:,判定树实质上是判定表的一种变形,有时比判定表更加直观,易于理解。对采购货物时的折扣率处理用判定树描述如下:,(7)PDL过程设计语言,PDL(Program Design Language)是一种描述功能模块算法的设计和加工细节的语言,也称为伪码,这是个笼统的名称,它是用正文形式描述数据处理和过程设计的工具。一方面PDL具有严格的关键字外部语法,用于定义控制结构和数据结构;另一方面PDL表示实际操作和条件的内部语法又是灵活自由的,以便适应多种情况的需要。因此可以说,PDL是一种“混杂”语言,它使用某一种(如自然语言)的词汇,同时却使用另一种语言(某一种结构化程序设计语言)
40、的语法。,PDL具有以下特点:,(1)关键字固定的语法:它提供了结构化控制结构、数据说明和模块化特性,为了结构清楚,通常在所有可能嵌套使用的控制结构的头和尾都有关键字,例如:ifendif(或fi)等;(2)自然语言的自由语法:易于从抽象描述开始,进行逐步求精;(3)具有数据说明的手段:既包括简单数据的说明,又包括复杂的数据结构的说明(如链表和层次数据结构);(4)具有模块定义和调用技术,提供各种接口的描述模式。,例如:用PDL描述求一组数中最大数的算法:,START ARRAY A Input a series of numbers to A SET MAX=A(1)DO FOR I=2 T
41、O N IF MAXA(I)THEN SET MAX=A(I)ENDIF ENDDO Print MAX END,将PDL作为一种设计工具有如下优点:可以作为注释插在源程序当中,促使维护人员在修改程序时也可相应地修改PDL注释,有助于保持文档的一致性;可以使用普通的正文编辑程序和文字处理系统,就能够完成PDL的书写和编辑工作;有部分特定的PDL自动处理程序,可以自动处理PDL算法生成程序代码。PDL的缺点是不如图形工具直观,描述复杂的条件组合与动作间的对应关系时,不如判定表那样清晰简单。,软件设计的步骤,1、目标选择 在一个项目中最为困难也是最能体现水平的就是目标选择。在前面的需求分析中,已经
42、得到了现行系统的逻辑模型,从总体设计角度看,现行系统就是要实现的目标,但还不完全是,因为现行系统并不是最佳系统。在实际工作中,用户常常把这个问题推给开发人员,开发人员也可以对用户提出这个要求。一方面开发人员对业务的了解有限;另一方面开发人员提出新的变动后,用户放的业务人员不一同意。双方共同认识到这个问题的实质,密接合作,共同研究,是解决问题的唯一出路。,2、提出设计方案 选择了合适的目标之后,接下来就该考虑如何实现这个目标了。对于所提出的方案多,范围大,可以从以下一个角度来考虑:(1)数据输入、输出和处理的位置(2)处理的反应速度(3)数据输入的模式和介质(4)数据输出(5)人机界面(6)数据
43、集成水平,3、选择合理方案 从前面所提供的方案中,选取几个较为合理的方案:低成本方案、中成本方案、高成本方案。根据项目的规模,方案数可以是两个,大项目可选择4到5个。对每个方案都要从以下几个方面进行仔细分析。(1)系统流程图和数据流图(2)物理系统成分清单(3)成本/效益情况(4)硬件平台、软件平台和选择及技术的选择(5)对人员素质的要求和考虑(6)最组织和业务的影响(7)实现这一方案的进度,4、推荐最佳方案 推荐最佳方案,除了考虑上述的情况外,还要注意以下几个方面:(1)约束(2)用户期望(3)系统类型(4)应用的类型(5)项目环境(6)项目发展方式(7)非功能需求,5、功能分解6、设计软件
44、结构7、数据库设计(1)模式设计(2)子模式设计(3)数据的安全性、完整性设计(4)数据库优化8、文档工作和复审,软件设计的方法,面向数据流的设计方法面向数据结构的设计方法面向对象的设计方法,面向数据结构的设计方法,面向数据流的方法是沿着流程路线着眼于功能处理,而面向数据结构的设计方法是把数据结构转变为软件结构,重点是数据,这样对模块的考虑更全面一些。面向数据结构的设计方法的最终目标是得出对程序处理过程的描述。Jackson方法Warnier方法,Jackson方法,Jackson方法是一种典型的面向数据结构的分析与设计方法,它以信息驱动,最终将信息转换成软件的程序结构。其基本思想是首先根据实
45、际问题给出处理问题所需要和产生的数据结构,一旦弄清了关于问题的输入输出数据结构,就可采用简单的方式直接导出程序的处理结构,然后应用Jackson的描述符号,将这个处理结构转换为程序的过程性描述。使用面向数据结构的设计方法,当然首先需要分析确定数据结构,并且用适当的工具清晰地描绘数据结构。,Jackson方法,Jackson图是Jackson方法配套使用的表达工具,可以作为需求分析和程序设计阶段的描述表达工具。对于程序中使用的种类繁多的数据结构,其各数据元素之间的逻辑关系只有顺序、选择、重复3种,所以逻辑数据结构也只有相应的3种:顺序结构、选择结构和重复结构。,Jackson方法,Jackson
46、结构程序设计方法基本上由下述五个步骤组成:(1)分析并确定输入数据和输出数据的逻辑结构,并用Jackson图描绘这些数据结构。(2)找出输入数据结构和输出数据结构中有对应关系的数据单元。(3)用下述三条规则从描绘数据结构的Jackson图导出描绘程序结构的Jackson图。(4)列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序结构图的适当位置。(5)用伪码表示程序。,Jackson图的三条规则,为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框(注意,如果这对数据单元在输入数据结构和输出数据结构中所处的层次不同,则和它们对应的处理框
47、在程序结构图中所处的层次与它们之中在数据结构图中层次低的那个对应);根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框;根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。总之,描绘程序结构的Jackson图应该综合输入数据结构和输出数据结构的层次关系而导出来。在导出程序结构图的过程中,由于改进的Jackson图规定在构成顺序结构的元素中不能有重复出现或选择出现的元素,因此可能需要增加中间层次的处理框。,4.3软件架构和设计过程中的风险分析,架构风险分析能使架构和设计层面的安全问题在软件开发周期中尽早识
48、别和解决。风险分析方法包括以下6种措施软件特性描述威胁分析漏洞评估风险可能性评定风险影响性评定风险修复计划,软件特性描述,包括:软件业务案例功能性和非功能性需求企业级架构需求误用/滥用案例文档、数据架构文档、详细设计文档软件开发计划、测试计划、风险管理计划,4.3.2 威胁分析,对于任何企业和机构来说,信息资产和其它固定资产一样都承载着重要的价值,因而也同样需要得到足够的保护。,资产等级,威胁识别,威胁是对系统和企业网的资产引起不期望事件而造成的损害的潜在可能性。或者也可以理解成是可能对资产造成影响的危害;(不单单只是黑客攻击,还包括自然灾害、员工的违规操作等等),威胁分类,威胁等级,4.3.
49、3 漏洞评估,漏洞也称脆弱性或者弱点,也就是具体存在的问题。值得注意的是,漏洞本身不会造成损失,它只是一种条件或环境、可能被威胁利用从而造成资产损失。漏洞不单单只是系统或软件上存在的bug,任何管理上的疏忽都是一种漏洞。,漏洞分类,漏洞等级,4.3.4 风险分析,风险是指某个威胁利用弱点引起某项资产或一组资产的损害,从而直接地或间接地引起企业或机构的损害。举例:,风险等级,风险分析原理,4.4安全原则与安全方针,安全原则安全方针,4.4.1 安全原则,最低权限(最小特权)安全地发生故障保障最弱环节安全(加固最脆弱环节)深入防御(深度防护)权限分离机制节约(简单化)通用机制最少化不信任不信任隐私
50、安全完全中立心理可接受提升私密性(提高保密性),最小特权,最小特权原则规定:只授予执行操作所必需的最少访问权,并且对于该访问权只准许使用所需的最少时间。访问系统的某一部分时常常存在一些风险,和该访问相关的权限被滥用。破坏最小优先权原则的一些有名的例子主要在UNIX系统中。例如,在UNIX系统中,根特权(root权限)是程序和小于1024的端口进行绑定所需要的,例如,为了在25端口(传统的SMTP端口)运行邮件服务器,程序需要root用户的权限。一旦在25端口建立服务后,基本就不再需要使用root权限了。安全考虑周全的程序要尽可能少用root特权,并让操作系统知道它在执行中不再需要这种特权了。再