软件开发中的防御性编程与测试策略
1. 失败案例警示
1992 年 10 月 26 日,伦敦救护服务局部署了一套全新的计算机化救护车调度系统,旨在为伦敦 600 平方英里区域内的 700 万人调度 300 多辆急救救护车,以取代完全手动的调度流程。然而,系统上线数小时后就无法追踪救护车的位置,导致多达 46 人因救护车未能及时到达、根本未到达,或在某些情况下多辆救护车同时到达而死亡。该系统失败的主要原因有两个:
- 不完整的数据 :当系统获取到的救护车位置数据不完整时,就无法正常运行。由于不知道救护车的位置,系统还会尝试重新调度正在使用中的车辆。
- 内存泄漏 :系统会保留不再需要的事件信息,随着时间推移,加上早期故障导致的大量呼叫,内存被填满,最终系统崩溃。
2. 防御性编程策略
为避免类似问题,在软件开发中可采取以下防御性编程策略:
- 不信任用户输入 :始终假定用户可能会带来风险。使用白名单来限制允许的字符或有效的文件扩展名类型。绝不要允许用户通过文本输入框直接访问数据库,而是使用预编译语句,并在用户输入接触数据库之前进行清理。
- 不假定服务始终可用 :如果使用其他服务(如 API),可能会有多种原因导致无法访问该服务。例如,服务不可用、域名存在问题、设备离线或返回的有效负载格式与预期不同。要做好最坏的打算,并编写代码来处理缺失或无效的服务和数据。
- 抛出和捕获异常 :许多编程语言在出错时会抛出异常,捕获这些异常并编写代码来处理失
超级会员免费看
订阅专栏 解锁全文
330

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



