哈尔滨工业大学软件构造课程笔记第六章第一节

6.1 健壮性与正确性

1. 什么是健壮性&正确性?

健壮性:系统在不正常输入或不正常外部环境下仍能够表现正常的程度

面向健壮性的编程:
处理未期望的行为和错误终止
即使终止执行,也要准确/无歧义的向用户展示全面的错误信息
错误信息有助于进行debug

健壮性原则(Postel定律)
Paranoia (偏执狂):总是假定用户恶意、假定自己的代码可能失败
Stupidity:把用户想象成白痴,可能输入任何东西
返回给用户的错误提示信息要详细、准确、无歧义
健壮性原则(Postel定律):对别人宽容点,对自己狠一点
对自己的代码要保守,对用户的行为要开放

鲁棒编程原理
危险的工具:封闭实现细节,限定用户的恶意行为
考虑极端情况,没有“不可能”

正确性:程序按照spec加以执行的能力,是最重要的质量指标!

正确性:永不给用户错误的结果
健壮性:尽可能保持软件运行而不是总是退出
正确性倾向于直接报错(error),健壮性则倾向于容错(fault-tolerance)

健壮性:让用户变得更容易:出错也可以容忍,程序内部已有容错机制
正确性:让开发者变得更容易:用户输入错误,直接结束。(不满足precondition的调用)
对外的接口,倾向于健壮;对内的实现,倾向于正确

可靠性=健壮性+正确性

error ≈ mistake程序员犯的错误
defect缺陷,bug的根源
defect ≈ fault, bug
failure失效,运行时的外在表现

程序员犯了一个错误 error (mistake),这导致了软件源代码的缺陷defect (fault, bug)。
如果执行此缺陷,在某些情况下,系统将产生错误的结果,从而导致故障failure。

Error → Fault → Failure

▪并非所有的软件缺陷都是由编码错误造成的。
-造成昂贵缺陷的一个常见原因是需求缺口,例如,未被识别的需求会导致程序设计者的疏忽。
▪不是所有的缺陷都会导致失败。
-例如,死代码中的缺陷永远不会导致失败。
▪当环境发生变化时,缺陷可能会变成故障。
-环境改变的例子包括在新的电脑硬件平台上运行的软件、改变源数据或与不同软件互动。
▪一个单一的缺陷可能会导致广泛的故障症状。

改进健壮性和正确性的步骤
▪步骤0:使用断言、防范性编程、代码审查、正式验证等来编写健壮且正确的代码
▪步骤1:观察故障症状(内存转储、堆栈跟踪、执行日志、测试)
▪步骤2:识别潜在的故障(bug定位、调试)
▪步骤3:修复错误(代码修改)

2. 如何度量健壮性和正确性?

外部观察角度MTBF
平均故障间隔时间(平均无故障运行时间),是指相邻两次故障之间的平均工作时间。
MTBF被计算为系统故障之间的算术平均(平均)时间。总的运行时间/总的故障次数

MTBF的计算依赖于对系统failure的定义
对于可修复系统,是指导致系统不可使用的failure
出现问题,但系统仍可运行,则不视为failure

MTBF用于描述可修复系统的平均无故障运行时间,MTTF(故障前平均时间)描述不可修复系统的故障前平均时间

内部观察角度(间接)
残余缺陷率:每千行代码中遗留的bug的数量

  • 1 - 10缺陷/kloc:典型的工业软件。
  • 0.1 - 1缺陷/kloc:高质量验证。Java库可以实现这种级别的正确性。
  • 0.01 - 0.1缺陷/kloc:最好的、安全关键的验证。美国国家航空航天局和排版

3.本章的三个目标

哈尔滨工业大学软件构造课程笔记第六章第一节