我在犹豫要问这个问题,因为这看起来很容易.
这个伪代码有什么问题?
在交换软件(用C编写)中,有;
这导致1990年电话系统崩溃(参见:http://users.csc.calpoly.edu/~jdalbey/SWE/Papers/att_collapse.html).
我需要一个非常简单的解释,为什么这段代码是错误的.我认为最简单的答案是在if子句中不可能中断?那么需要编写什么语句而不是if子句中的break来获取想要的效果,这会破坏if子句?
我怀疑说明/伪代码不正确时说:
如果那意味着:
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,伪代码有:
在伪代码中,程序内容如下:
Run Code Online (Sandbox Code Playgroud)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当目标交换机在第一个消息仍然忙于第一个(缓冲区不为空,第7行)时收到两个紧密定时消息中的第二个时,程序应该从if子句(第7行)中退出,处理传入消息,并设置指向数据库的指针(第11行).相反,由于else子句中的break语句(第10行),程序完全退出case语句并开始执行覆盖数据的可选参数工作(第13行).纠错软件检测到覆盖并在关闭[ sic ]重置时关闭开关.由于每个交换机都包含相同的软件,因此重置会在网络中级联,从而使系统无法运行.
这与我的假设一致 - 问题中的伪代码是对论文中伪代码的错误表征.
关于同一主题的另一个参考文献(通过Google搜索'att crash 1990 4ess'找到)说:
错误说明
在ACM的软件工程注释[参考文献2]中报告的是,软件缺陷被追溯到基本编程错误,其描述如下:
在违规的"C"程序文本中有一个形式的构造:[ 原始的不规则缩进 ]
Run Code Online (Sandbox Code Playgroud)/* ``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编程错误描述
错误的是程序员认为应用于上述段落中的if语句的break语句显然从未被执行过.如果是的话,那么测试人员会注意到这种异常行为并且能够发现[ 原文如此 ]
对此语句的唯一警告如下:应用于代码的测试可能包含可以揭示错误的信息; 但是,如果测试人员没有检查输出并注意到错误,则缺陷不在于[ 原文如此 ]
在错误的中断语句的情况下,很可能已经检测到错误.
参考
"我们能相信我们的软件吗?",新闻周刊,1990年1月29日.
ACM SIGSOFT,软件工程笔记,卷.1990年4月,第11页,第11页,第11页.
显然,程序员确实认为这break会结束if声明; 这是一场小小的精神停电导致了大规模的现实世界停电.