软件可靠性与安全性-验证确认(2)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
➢ 控制程序的复杂性, 使开发人员和维护人员对 程序智力上可管理
➢ 控制软件体系结构的复杂性 ➢ 保持单元功能独立性
功能独立性要求软件单元具有强内聚性和 松散耦合性 功能独立性控制了单元的规模
控制软件的复杂性
➢ 内聚性 模块相对功能密度的度量,依赖于一个单 元中各种操作之间互相联系的紧密程度
➢ 内聚性类型 功能内聚性 顺序内聚性 通讯内聚性 时间内聚性 过程内聚性 逻辑内聚性
风险隔离
➢ 划分(Partitioning) 为功能上独立的软件部件提供隔离的过程
➢ 使用划分的目的 抑制故障的影响和/或隔离故障,防止组 件之间特殊的相互作用和交叉耦合干扰 减少软件验证过程的工作量 最小化安全相关组件的规模
风险隔离
➢ 划分等级的确定 对于通过划分提供保护的软件,可使用与 每个组件相关的最严重的失效状态类别来 确定该组件的重要等级 区别对待不同等级的软件组件
If .. then
If .. and .. then
Do .. While
Switch
If .. then .. else
If .. or .. then
While .. Do
复杂性的影响
基本复杂度与可靠性风险的关系
基本复杂度
可靠性风险
1~4
结构化,较少风险
>4
非结构化,高风险
控制软件的复杂性
➢ 耦合性类型 简单数据耦合 数据结构耦合 控制耦合 公用耦合 内容耦合
控制软件的复杂性
➢ 简单数据耦合
通过参数传递数据,传递的数据是非结构 化的
模块A
Array X do x do y call B(x:12) do z
模块B
do m set w = x:12 do p
控制软件的复杂性
➢ 数据结构耦合
通过参数表实现传递,传递的数据是完整 的数据结构
模块A
do x do y call B(Array X) do z
模块B
do m set x:12 = 0 do p
控制软件的复杂性
➢ 控制耦合
当一个模块中有几个操作,通过传入模块 的数据控制它的行为
模块A
do x do y call B(0) do z
软件可靠性与安全性
第五部分
软件可靠性与安全性设计
提要
1 防错性设计 23 健壮性设计 33 容错性设计
防错性设计
➢ 简化设计 ➢ 风险隔离 ➢ 算法与数据管理 ➢ 慎用易错架构 ➢ 使用监错技术 ➢ 多任务管理
简化设计
➢ 复杂性是可靠性最凶恶的对手 ➢ 复杂的软件
代码规模更大、缺陷更多 交互关系更多、缺陷更多 更难测试、不充分的可能性更大 设计、实现、配置、使用的难度更大 用户更难理解
➢ 内容耦合
一个模块使用了另外一个模块中代码,或 者它改变了其中的局部变量
模块A
do x do y goto B:100 do z
模块B
do m do n 100 read(x:12) of Array X set x:12 = p
控制软件的复杂性
耦合类型 简单数据耦合 数据结构耦合
控制耦合 公用耦合 内容耦合
软件复杂性
➢ 结构复杂性 接口复杂度 调用关系复杂度
➢ 单元复杂性 规模 圈复杂度 基本圈复杂度
软件复杂性
➢ 圈复杂用于衡量一个软件单元的复杂程度, 数 量上表现为独立路径的条数 V(G)=e – n + 2
1
2
3
4
5
6
7
9 8
10
复杂性的影响
圈复杂度与可靠性风险的关系
圈复杂度
可靠性风险
1~10
简单过程,较少风险
11~20 比较复杂,中等风险
21~50 复杂,高风险
>50
不可测试,极高风险
复杂性的影响
圈复杂度与不良修复概率的关系
圈复杂度
不良修复概率
1~10
5%
20~30
20%
>50
40%
接近100
60%
基本复杂度
➢ 衡量程序结构化程度 非结构成分降低了程序的质量,增加了代 码的维护难度,使程序难于理解
模块B
read flag m if flag m = 0
任务m else
任务p endif
控制软件的复杂性
➢ 公用耦合 两个模块使用并修改了相同的数据源
模块A
do x do y set w = 10 do z
数据源
公共变量w
模块B
do m do n set p = 68 add w to p
控制软件的复杂性
控制软件的复杂性
➢ 功能内聚性 模块执行一项并且仅仅是一项工作
数组排序
控制软件的复杂性
➢ 顺序内聚性
模块内包含需要按特定顺序进行的、逐步 分享数据而又不形成一个完整功能的一系 列操作
演示记录
读取报告 数据
产生图形
将记录 格式化
显示记录
控制软件的复杂性
➢ 通讯内聚性 在同一个模块中存在多个操作,只是因为 使用了相同的数据,不存在其它任何联系
过程初始化
控制软件的复杂性
➢ 逻辑内聚性 将完成相似逻辑任务的功能组合在一起, 形成一个模块
输ຫໍສະໝຸດ Baidu模块
特征码输入
波形输入
目录输入
控制软件的复杂性
内聚类型 功能内聚性 顺序内聚性 通讯内聚性 过程内聚性 时间内聚性 逻辑内聚性
决策 可取的内聚性 不可取的内聚性
控制软件的复杂性
➢ 耦合性 两个模块之间联系的紧密程度,依赖于模 块间接口的复杂性、引用或进入模块的点、 通过接口传递的数据
记录显示打印模块
记录
显示记录
打印记录
控制软件的复杂性
➢ 过程内聚性
模块中的操作是按某一特定顺序进行,而 顺序操作使用的并不是相同数据
波形转换模块
读取波 形参数
傅里叶变换
否
是
一致
再校准
显示
控制软件的复杂性
➢ 时间内聚性 多个功能因为执行时间相互关联的原因才 被放入同一个模块里
启动模块
文件系统检查
事务初始化
决策 可取的耦合
不可取的耦合
控制软件的复杂性
➢ 模块的扇出 模块的直属下层模块的个数
➢ 模块的扇入 有多少个上级模块调用本模块
➢ 基本原则 上层模块有较高的扇出 下层模块有较高的扇入 单元调用的嵌套层数不大于7 扇入/扇出数不大于7
控制模块的复杂性
➢ 单元的理论最佳长度66到132行 ➢ 尽量降低模块的圈复杂度
不大于10 ➢ 保持模块的控制流从顶到底 ➢ 模块中的循环有正常的退出条件 ➢ 模块应只有唯一的入口和唯一的出口 ➢ 清晰定义每个模块的所有输入/输出 ➢ 对模块的输入/输出进行范围检测
风险隔离
➢ 在数据区和指令区建立防火墙
为了防止程序把数据错当指令来执行,要 采用将数据与指令分隔存放的措施
必要时,在数据区和表格的前后加入适当 的NOP指令和跳转指令,使NOP指令的总 长度等于最长指令的长度,然后加入一条 跳转指令,将控制转向出错处理程序
➢ 控制软件体系结构的复杂性 ➢ 保持单元功能独立性
功能独立性要求软件单元具有强内聚性和 松散耦合性 功能独立性控制了单元的规模
控制软件的复杂性
➢ 内聚性 模块相对功能密度的度量,依赖于一个单 元中各种操作之间互相联系的紧密程度
➢ 内聚性类型 功能内聚性 顺序内聚性 通讯内聚性 时间内聚性 过程内聚性 逻辑内聚性
风险隔离
➢ 划分(Partitioning) 为功能上独立的软件部件提供隔离的过程
➢ 使用划分的目的 抑制故障的影响和/或隔离故障,防止组 件之间特殊的相互作用和交叉耦合干扰 减少软件验证过程的工作量 最小化安全相关组件的规模
风险隔离
➢ 划分等级的确定 对于通过划分提供保护的软件,可使用与 每个组件相关的最严重的失效状态类别来 确定该组件的重要等级 区别对待不同等级的软件组件
If .. then
If .. and .. then
Do .. While
Switch
If .. then .. else
If .. or .. then
While .. Do
复杂性的影响
基本复杂度与可靠性风险的关系
基本复杂度
可靠性风险
1~4
结构化,较少风险
>4
非结构化,高风险
控制软件的复杂性
➢ 耦合性类型 简单数据耦合 数据结构耦合 控制耦合 公用耦合 内容耦合
控制软件的复杂性
➢ 简单数据耦合
通过参数传递数据,传递的数据是非结构 化的
模块A
Array X do x do y call B(x:12) do z
模块B
do m set w = x:12 do p
控制软件的复杂性
➢ 数据结构耦合
通过参数表实现传递,传递的数据是完整 的数据结构
模块A
do x do y call B(Array X) do z
模块B
do m set x:12 = 0 do p
控制软件的复杂性
➢ 控制耦合
当一个模块中有几个操作,通过传入模块 的数据控制它的行为
模块A
do x do y call B(0) do z
软件可靠性与安全性
第五部分
软件可靠性与安全性设计
提要
1 防错性设计 23 健壮性设计 33 容错性设计
防错性设计
➢ 简化设计 ➢ 风险隔离 ➢ 算法与数据管理 ➢ 慎用易错架构 ➢ 使用监错技术 ➢ 多任务管理
简化设计
➢ 复杂性是可靠性最凶恶的对手 ➢ 复杂的软件
代码规模更大、缺陷更多 交互关系更多、缺陷更多 更难测试、不充分的可能性更大 设计、实现、配置、使用的难度更大 用户更难理解
➢ 内容耦合
一个模块使用了另外一个模块中代码,或 者它改变了其中的局部变量
模块A
do x do y goto B:100 do z
模块B
do m do n 100 read(x:12) of Array X set x:12 = p
控制软件的复杂性
耦合类型 简单数据耦合 数据结构耦合
控制耦合 公用耦合 内容耦合
软件复杂性
➢ 结构复杂性 接口复杂度 调用关系复杂度
➢ 单元复杂性 规模 圈复杂度 基本圈复杂度
软件复杂性
➢ 圈复杂用于衡量一个软件单元的复杂程度, 数 量上表现为独立路径的条数 V(G)=e – n + 2
1
2
3
4
5
6
7
9 8
10
复杂性的影响
圈复杂度与可靠性风险的关系
圈复杂度
可靠性风险
1~10
简单过程,较少风险
11~20 比较复杂,中等风险
21~50 复杂,高风险
>50
不可测试,极高风险
复杂性的影响
圈复杂度与不良修复概率的关系
圈复杂度
不良修复概率
1~10
5%
20~30
20%
>50
40%
接近100
60%
基本复杂度
➢ 衡量程序结构化程度 非结构成分降低了程序的质量,增加了代 码的维护难度,使程序难于理解
模块B
read flag m if flag m = 0
任务m else
任务p endif
控制软件的复杂性
➢ 公用耦合 两个模块使用并修改了相同的数据源
模块A
do x do y set w = 10 do z
数据源
公共变量w
模块B
do m do n set p = 68 add w to p
控制软件的复杂性
控制软件的复杂性
➢ 功能内聚性 模块执行一项并且仅仅是一项工作
数组排序
控制软件的复杂性
➢ 顺序内聚性
模块内包含需要按特定顺序进行的、逐步 分享数据而又不形成一个完整功能的一系 列操作
演示记录
读取报告 数据
产生图形
将记录 格式化
显示记录
控制软件的复杂性
➢ 通讯内聚性 在同一个模块中存在多个操作,只是因为 使用了相同的数据,不存在其它任何联系
过程初始化
控制软件的复杂性
➢ 逻辑内聚性 将完成相似逻辑任务的功能组合在一起, 形成一个模块
输ຫໍສະໝຸດ Baidu模块
特征码输入
波形输入
目录输入
控制软件的复杂性
内聚类型 功能内聚性 顺序内聚性 通讯内聚性 过程内聚性 时间内聚性 逻辑内聚性
决策 可取的内聚性 不可取的内聚性
控制软件的复杂性
➢ 耦合性 两个模块之间联系的紧密程度,依赖于模 块间接口的复杂性、引用或进入模块的点、 通过接口传递的数据
记录显示打印模块
记录
显示记录
打印记录
控制软件的复杂性
➢ 过程内聚性
模块中的操作是按某一特定顺序进行,而 顺序操作使用的并不是相同数据
波形转换模块
读取波 形参数
傅里叶变换
否
是
一致
再校准
显示
控制软件的复杂性
➢ 时间内聚性 多个功能因为执行时间相互关联的原因才 被放入同一个模块里
启动模块
文件系统检查
事务初始化
决策 可取的耦合
不可取的耦合
控制软件的复杂性
➢ 模块的扇出 模块的直属下层模块的个数
➢ 模块的扇入 有多少个上级模块调用本模块
➢ 基本原则 上层模块有较高的扇出 下层模块有较高的扇入 单元调用的嵌套层数不大于7 扇入/扇出数不大于7
控制模块的复杂性
➢ 单元的理论最佳长度66到132行 ➢ 尽量降低模块的圈复杂度
不大于10 ➢ 保持模块的控制流从顶到底 ➢ 模块中的循环有正常的退出条件 ➢ 模块应只有唯一的入口和唯一的出口 ➢ 清晰定义每个模块的所有输入/输出 ➢ 对模块的输入/输出进行范围检测
风险隔离
➢ 在数据区和指令区建立防火墙
为了防止程序把数据错当指令来执行,要 采用将数据与指令分隔存放的措施
必要时,在数据区和表格的前后加入适当 的NOP指令和跳转指令,使NOP指令的总 长度等于最长指令的长度,然后加入一条 跳转指令,将控制转向出错处理程序