6-1 健壮性与正确性

一. 健壮性

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

  2. 面向健壮性编程有以下特征:

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

  3. Postel’s Law

  • 总是假定用户恶意、假定自己的代码可能失败
  • 把用户想象成白痴,可能输入任何东西。此时返回给用户的错误提示信息要详细、准确、无歧义

  对自己的代码要保守,对用户的行为要开放。

  4. 健壮性实现原则:

  • 封闭实现细节,限定用户的恶意行为
  • 考虑极端情况,没有“不可能”

二. 正确性

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

  2. 正确性与健壮性:

  • 正确性:永不给用户错误的结果
  • 健壮性:尽可能保持软件运行而不是总是退出

  正确性倾向于直接报错 (error),健壮性则倾向于容错 (fault tolerance) 。


  例如:
软件构造 6-1 Robustness and Correctness
  或者例如:软件构造 6-1 Robustness and Correctness


  使用角度

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

  接口角度

  • 面向真实用户的对外的接口、面向客户端(或可能被他人调用)的接口。其倾向于健壮性
  • 对内的接口(自己使用但别人不可能使用)。倾向于正确性

三. 相关定义

  1. 可靠性 = 健壮性 + 正确性

  2. 相关术语:

  • 错误 (error ≈ mistake) :程序员犯的错误
  • 缺陷 (defect) : bug 的根源
  • fault (defect ≈ fault, bug)
  • 失效 (failure) :运行时的外在表现(缺陷爆发、程序宕机)

  因果关系:error → defect/fault/bug → failure
  程序员犯错导致软件存在缺陷,导致软件运行时失效

四. 过滤缺陷、提升健壮性与正确性

  编程时:

  • :使用断言、防御性编程、代码评审、形式化验证等方法来编写具有健壮性和正确性目标的代码

  编程后:

  • 观察故障症状 (内存转储、堆栈跟踪、执行日志、测试)
  • 识别潜在的错误 (错误定位,调试)
  • 修复错误 (代码修订)

  MTBF 平均失效间隔时间 (外部观察角度,直接):两次邻近的失效的平均时间间隔。
  由于部分系统可以自我修复并且修复时不能访问系统,因此通常 MTBF 是两个时间的加和:修复时间 + 紧邻的失效时间。软件构造 6-1 Robustness and Correctness


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

  • 1-10 defects / kloc
  • 0.1-1 defects / kloc
  • 0.01-0.1 defects / kloc

  Halstead Volume:基于源代码中(不同的)操作符和操作数的数量的复合度量。


软件构造 6-1 Robustness and Correctness

相关文章: