软件开发中的防御性编程与测试
1. 失败案例警示
1.1 伦敦救护车调度系统
1992 年 10 月 26 日,伦敦救护服务局部署了一套全新的计算机化系统,用于为伦敦 600 平方英里区域内的 700 万人调度 300 多辆急救救护车。然而,系统启动数小时后就无法跟踪救护车的位置。由于救护车未能及时到达、根本未到达,甚至有时多辆救护车同时到达,导致多达 46 人死亡。
该系统失败的主要原因有两个:
- 不完整的数据 :当系统接收到不完整的救护车位置数据时,无法正常运行。由于不知道救护车的位置,系统会尝试重新调度正在使用的车辆。
- 内存泄漏 :即使事件信息不再需要,系统仍会保留这些信息。随着时间的推移,加上早期故障导致的大量呼叫,内存被填满,最终系统崩溃。
1.2 防御性编程的重要性
如果从一开始就采用防御性编程,这些问题或许可以避免。通过假设最坏的情况并编写代码来处理这些情况,可以在问题出现之前就加以解决。
2. 防御性编程的实践
2.1 保护代码的关键要点
为了保护代码,需要注意以下几个方面:
- 不信任用户输入 :始终假设用户可能会带来风险。使用白名单来允许特定字符或有效的文件扩展名类型。避免让用户通过文本输入框直接访问数据库,使用预编译语句并在用户输入接触数据库之前进行清理。
- 不假定服务始终可用 :使用 API 等外部服务时,可能会遇到各种问题,如服务不可用、域名问
超级会员免费看
订阅专栏 解锁全文
328

被折叠的 条评论
为什么被折叠?



