Review: 调试理论
Review: 调试理论
Review: 调试理论
回顾:调试理论
程序 = 物理世界过程在信息世界中的投影
Bug = 违反程序员对 “物理世界” 的假设和约束
需求 → 设计 → 代码 (
Fault/bug
) → 执行 (
Error
) → 失败 (
Failure
)
我们只能观测到 failure (可观测的结果错)
我们可以检查状态的正确性 (但非常费时)
无法预知 bug 在哪里 (每一行 “看起来” 都挺对的)
并发 bugs
“正确性” 不仅不明确,而且难检查
Review: 调试理论
推论
程序 = 物理世界过程在信息世界中的
有损
投影
只管 “翻译” 代码,不管和实际需求 (规约) 是否匹配
例子:“山寨支付宝” 中的余额
balance
(这是一个数据竞争!)
0 → 18446744073709551516
“正常人” 都不会认为这个是 “对的”
首先,这是一个 underflow
“balance” 自带 no-underflow 的含义
而且,这个数额大幅增加也不对
Review: 调试理论
真正的 “软件危机”
Specification Crisis
软件的规约联系了人类世界
我们
无法
用编程语言写出全部规约
即便能写出的规约,也很难
证明
Search-space Curse
特性的交互组合是指数增长的
即便知道 specification,你也很难证明复杂的状态机满足它
猜想:“Complex systems are chaotic.”