C. Break,Switch,If中的愚蠢错误.1990年电话网络崩溃

alg*_*ine 3 c

我在犹豫要问这个问题,因为这看起来很容易.

这个伪代码有什么问题?

在交换软件(用C编写)中,有;

  • 一个漫长的"do ... while"结构,其中包含
  • 一个"开关"声明,其中包含
  • 一个"if"条款,其中包含
  • 一个"休息",用于"if"条款
    • 但反而突破了"开关"声明.

这导致1990年电话系统崩溃(参见:http://users.csc.calpoly.edu/~jdalbey/SWE/Papers/att_collapse.html).

我需要一个非常简单的解释,为什么这段代码是错误的.我认为最简单的答案是在if子句中不可能中断?那么需要编写什么语句而不是if子句中的break来获取想要的效果,这会破坏if子句?

Jon*_*ler 6

我怀疑说明/伪代码不正确时说:

  • 一个"休息",用于"if"条款

如果那意味着:

  • a break,用于终止do while循环

然后问题描述是有道理的.

do
{
    ...
    switch (...)
    {
    case ...:
        ...
        break;
    ...
    case ...:
        ...
        if (critical_condition())
            break;  // Intended to exit loop - actually exits switch only
        ...
        break;      // Terminates the case in the switch
     }
 } while (!time_to_stop());
Run Code Online (Sandbox Code Playgroud)

读取问题中引用的URL,伪代码有:

在伪代码中,程序内容如下:

1  while (ring receive buffer not empty 
          and side buffer not empty) DO

2    Initialize pointer to first message in side buffer
     or ring receive buffer

3    get copy of buffer

4    switch (message)

5       case (incoming_message):

6             if (sending switch is out of service) DO

7                 if (ring write buffer is empty) DO

8                     send "in service" to status map

9                 else

10                    break

                  END IF

11           process incoming message, set up pointers to
             optional parameters

12           break
       END SWITCH

13   do optional parameter work
Run Code Online (Sandbox Code Playgroud)

当目标交换机在第一个消息仍然忙于第一个(缓冲区不为空,第7行)时收到两个紧密定时消息中的第二个时,程序应该从if子句(第7行)中退出,处理传入消息,并设置指向数据库的指针(第11行).相反,由于else子句中的break语句(第10行),程序完全退出case语句并开始执行覆盖数据的可选参数工作(第13行).纠错软件检测到覆盖并在关闭[ sic ]重置时关闭开关.由于每个交换机都包含相同的软件,因此重置会在网络中级联,从而使系统无法运行.

这与我的假设一致 - 问题中的伪代码是对论文中伪代码的错误表征.


关于同一主题的另一个参考文献(通过Google搜索'att crash 1990 4ess'找到)说:

错误说明

在ACM的软件工程注释[参考文献2]中报告的是,软件缺陷被追溯到基本编程错误,其描述如下:

在违规的"C"程序文本中有一个形式的构造:[ 原始的不规则缩进 ]

/* ``C'' Fragment to Illustrate AT&T Defect */   
do {

      switch expression {

          ...

                case (value):

                        if (logical) {
                                sequence of statements
                                        break
                        }
                        else
                        {
                                another sequence of statements
                        }
                        statements after if...else statement
                }

                statements after case statement

        } while (expression)

        statements after do...while statement
Run Code Online (Sandbox Code Playgroud)

编程错误描述

错误的是程序员认为应用于上述段落中的if语句的break语句显然从未被执行过.如果是的话,那么测试人员会注意到这种异常行为并且能够发现[ 原文如此 ]

对此语句的唯一警告如下:应用于代码的测试可能包含可以揭示错误的信息; 但是,如果测试人员没有检查输出并注意到错误,则缺陷不在于[ 原文如此 ]

在错误的中断语句的情况下,很可能已经检测到错误.

参考

  1. "我们能相信我们的软件吗?",新闻周刊,1990年1月29日.

  2. ACM SIGSOFT,软件工程笔记,卷.1990年4月,第11页,第11页,第11页.


显然,程序员确实认为这break会结束if声明; 这是一场小小的精神停电导致了大规模的现实世界停电.