下面这段代码是从 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 语句。