6-1 健壮性与正确性
一. 健壮性
1. 健壮性:系统在不正常输入或不正常外部环境下仍能够表现正常的程度。
2. 面向健壮性编程有以下特征:
- 处理未期望的行为和错误终止
- 即使终止执行,也要准确 / 无歧义的向用户展示全面的错误信息
- 错误信息有助于进行 debug
3. Postel’s Law
- 总是假定用户恶意、假定自己的代码可能失败
- 把用户想象成白痴,可能输入任何东西。此时返回给用户的错误提示信息要详细、准确、无歧义
对自己的代码要保守,对用户的行为要开放。
4. 健壮性实现原则:
- 封闭实现细节,限定用户的恶意行为
- 考虑极端情况,没有“不可能”
二. 正确性
1. 正确性:程序按照 spec 加以执行的能力,这是最重要的质量指标。
2. 正确性与健壮性:
- 正确性:永不给用户错误的结果
- 健壮性:尽可能保持软件运行而不是总是退出
正确性倾向于直接报错 (error),健壮性则倾向于容错 (fault tolerance) 。
例如:
或者例如:
使用角度:
- 健壮性:让用户变得更容易:出错也可以容忍,程序内部已有容错机制
- 正确性:让开发者变得更容易:用户输入错误(不满足 precondition 的调用),直接结束。
接口角度:
- 面向真实用户的对外的接口、面向客户端(或可能被他人调用)的接口。其倾向于健壮性。
- 对内的接口(自己使用但别人不可能使用)。倾向于正确性。
三. 相关定义
1. 可靠性 = 健壮性 + 正确性
2. 相关术语:
- 错误 (error ≈ mistake) :程序员犯的错误
- 缺陷 (defect) : bug 的根源
- fault (defect ≈ fault, bug)
- 失效 (failure) :运行时的外在表现(缺陷爆发、程序宕机)
因果关系:error → defect/fault/bug → failure
程序员犯错导致软件存在缺陷,导致软件运行时失效
四. 过滤缺陷、提升健壮性与正确性
编程时:
- :使用断言、防御性编程、代码评审、形式化验证等方法来编写具有健壮性和正确性目标的代码
编程后:
- 观察故障症状 (内存转储、堆栈跟踪、执行日志、测试)
- 识别潜在的错误 (错误定位,调试)
- 修复错误 (代码修订)
MTBF 平均失效间隔时间 (外部观察角度,直接):两次邻近的失效的平均时间间隔。
由于部分系统可以自我修复并且修复时不能访问系统,因此通常 MTBF 是两个时间的加和:修复时间 + 紧邻的失效时间。
残余缺陷率(内部观察角度,间接):每千行代码中遗留的 bug 的数量。
- 1-10 defects / kloc
- 0.1-1 defects / kloc
- 0.01-0.1 defects / kloc
Halstead Volume:基于源代码中(不同的)操作符和操作数的数量的复合度量。