C高级---switch 的另一个问题--break 中断了什么

下面这段代码是从 AT&T 的电话服务程序中摘录下来的,这段代码曾在全国范围内造成AT&T电话服务的停顿。从1990年1月15日下午起,大约有9个小时,AT&T 电话网络的大部分都处于瘫痪状态。当时的电话交换(行业用语是“switch system (交换系统)”)都采用了计算机系统,而这段代码运行于4ESS型 CentralOffice Switching System(中央办公交换系统)。它证明了在C语言中,人们太容易低估“break”语句对控制结构的影响。

network code()
switch(line)(
case THING1:doit1();
break;
case THING2:
if(x == STUFF) 
{
    do_first_stuff();
    if(Y == OTHER STUFF)
        break;
    do later_stuff();
)/*代码的意图是跳到这里 .......*/
initialize modes_pointer();
break;
defauit:
processing();
* ...但事实上跳到了这里。*/
use_modes_pointer(); /* 致使 modes_pointer 未初始化 */

代码作了一些简化,但用于说明这个 Bug 已经足够了。那个程序员希望从“if”语句跳出,但他却忘了 break 语句事实上跳出的是最近的那层循环语句或 switch 语句。现在,它跳出了switch语句,然后执行 use_modes_pointer();这条语句。但是,必要的初始化工作并未完成,为将来程序的失败埋下了伏笔。
这段代码最终导致了 AT&T 114 年的历史上第一次重大的网络故障,这次事件的详细报道刊登于1990年1月22日Telephony 杂志的第11页。事实上,网络信号系统的这个设计失误引起了一连串的反应,最终导致了整个长话网络的瘫痪。而这一切,都归因于C语言中的一条switch 语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值