知识卡片
测试无法证明正确性,只能证伪
内容
“被认为正确的方案”和”真正正确的方案”是两回事——金链问题的第一个答案(切 3 次)看起来无懈可击,直到重新审视被切开的三段金链长度(1、2、4 环)才发现只需切 1 次就够。软件领域同理:一个程序通过了所有测试用例,只能证明它对这些测试用例是正确的,任何超出测试范围的结论都只是预测,代码中真正的错误往往正是测试和开发过程里被忽略的细微疏漏,2003 年美加大停电正是监控软件里一个未被测出的竞态条件酿成的。发散:测试的本质是”举出反例来证伪”,而不是”穷举所有情形来证实”——除非测试覆盖了输入空间的每一种可能(对绝大多数真实程序这不可行),测试永远只能增加你对正确性的信心,无法真正担保正确性,这正是形式化验证(用数学证明代替经验测试)存在的意义。
参考来源
《计算机科学概论》第5章《算法》