2004年12月25日,美国商务航空公司(Comair)由于计算机系统瘫痪,不得不启动“有限”飞行计划,取消圣诞节期间飞往119个城市的1100个航班,给3万名乘客带来麻烦。
虽然航空公司没有透露具体损失数额,但据专家估计,美国商务航空公司这次发生的故障至少造成几百万美元的损失:他们要赔偿乘客,为乘客提供食宿或预定其它航班,同时还要支付公司员工的加班费。
引起计算机系统瘫痪的软件是美国商务航空公司使用的机组调度软件。经过调查,调度软件失败是因为一个16位计数器溢出造成。
当飞机未能按照预定班次起飞,航空公司会重新安排这架飞机的起飞时间和场地。同时,机组调度软件会记录这次重新安排,它使用一个有符号16位计数器来记录所有飞机重新安排的次数。这个16位计数器向上计数到32767后,再增加1次就会溢出为-32768。机组调度软件没有检查该计数器是否溢出,更没有相应的故障处理,所以计数器溢出后,调度软件崩溃。
本来机组调度软件每个月的月初都会将这个计数器清零,而且平均每个月重新安排的飞行次数远低于32767次,但是2004年12月,这个月频繁的风暴造成过多机组重新安排,从而导致该16位计数器溢出!
在软件编写过程中,边界检查和故障处理是必须要有的。程序运行的环境千变万化,在各个方面,我们的程序都要是能“防弹”的。
SANS研究所主管AlanPaller曾说过:(SANS研究所提供的)网络安全漏洞排行榜前20个漏洞,都是由于糟糕的代码编写、不严格的测试、马虎的软件工程实践所造成的。这些问题并非如某些外行所想,是什么“前沿”问题,他们的技术解决方案都存在,可就是没有得到很好的实现!
相关阅读
历史上的重大软件BUG启示录 第5篇---AT&T长途电话网瘫痪事件
历史上的重大软件BUG启示录 第6篇---蠕虫“冲击波”
作者:朱工
首发博客:https://freertos.blog.csdn.net/article/details/53856282
关注FreeRTOS从基础到高级专栏,即时收取FreeRTOS系列文章。