计算机科学之父的代码也有 bug:藏在《编程艺术》里 40 年的长除法

高德纳《计算机程序设计艺术》第二卷的多精度长除法算法,40 多年后被发现藏着一个只在特殊输入下触发的 bug。这件事比 bug 本身更值得思考:为什么连"神级"代码都会出错,以及我们该如何面对程序正确性这个无解难题。
2026 年 8 月,程序员社区被一条新闻炸了锅:有人在《计算机程序设计艺术》(TAOCP)第二卷的多精度长除法算法(算法 4.3.1D)里,挖出了一个潜伏了几十年的 bug。这部被无数人奉为"圣经"的著作,它的作者是图灵奖得主、被誉为"算法分析之父"的高德纳(Donald Knuth)——连他都"翻了车"。
一个只藏在角落里的 bug
这个 bug 妙就妙在它极其隐蔽:多精度长除法在绝大多数输入下都算得对,只有在某些特殊的输入组合下才会给出错误结果。几十年来,读过这段代码的读者、引用它的实现者不计其数,却没人撞进那个"角落"。它像一个埋在沙漠深处的雷,只在极罕见的路径上才会被踩响。这正是软件工程里最难缠的一类问题——边界条件 bug。
图1:边界 bug 只藏在极少数输入组合里,测试永远覆盖不到全部
为什么我们永远无法"测完"
根本原因在于一个朴素的事实:程序的输入空间通常是无限的。一个接受几个整数参数的函数,可能的输入组合就是天文数字;而测试只能抽样。无论你测了一万次还是一百万次,都是在"有限"里打转——测试能证明"有 bug",却永远无法证明"没 bug"。高德纳的 bug 能活 40 年,恰恰说明它落在所有人抽样的盲区之外。
那怎么办?
工程界的答案是分层设防:用边界值分析主动盯住 0、1、最大值、越界值这些"事故多发地段";用回归测试确保每次改动不引入新错;对真正"错不起"的系统(航空航天、金融清算、编译器核心),再上形式化验证——用 Lean、Coq 这类证明助手,把程序当数学定理来证明,机器核对每一步。高德纳的 bug 不是"神设崩塌",而是对所有人的一句提醒:对代码保持敬畏,是所有程序员的第一课。
关联推荐
- AI 专业本科必读书单 — 从数学基础到科研前沿的完整地图
- 半导体简史:从一粒沙子到万亿晶体管 — 硬件的正确性同样生死攸关
评论 (0)
正文划词可点「问萝卜特」——自动发评论并由 AI 回复
加载评论中…