章杉留意到《C专家编程》里面提到了一个奇怪的大赛——国际C语言混乱代码大赛。
出门右拐度娘了一下:
国际C语言混乱代码大赛(IOCCC,TheInternationalObfuscatedCCodeContest)是一项国际编程赛事,从1984年开始,每年举办一次(1997年、1999年、2002年、2003年和2006年例外)。目的是写出最有创意的最让人难以理解的C语言代码。
章杉:Σ(っ°Д°;)っ
居然还特么真的有这个比赛?而且还是国际编程赛事???
IOCCC是由蓝登·克特·诺尔(LandonCurtNoll)与拉里·贝索(LarryBassel)在1984年受雇于国家半导体(NationalSemiconductor)的Genix程序移殖事业群时开始的。比赛的点子是来自他们俩比较彼此有关于它们得修正的某些写得很烂代码的笔记。
每年,IOCCC的比赛规则会张贴在其网站上。规则每年不同,并且会随附上一组的指导方针以试图表达规则的精神。
这些规则通常是蓄意书写成文,伴随着精巧的漏洞让参赛者有所鼓励去发现并滥用。
啧,虽然听起来不太入流,但章杉觉得有必要还是可以参加一下的!
趣味性十足有木有~
书里面倒也不全是有趣的东西,有些东西很沉重!
在《C专家编程》这本书中,章杉看到了这样一个例子:
“1993年春天,在SunSoft的操作系统开发小组里,我们(《C专家编程》作者)接到了一个“一级优先”的Bug报告,是一个关于异步IO库的问题。
如果这个Bug不解决,将会使一桩价值2000万美元的硬件产品生意告吹,因为对方需要使用这个库的功能。所以,我们顶着重压寻找这个Bug。经过几次紧张的调试,问题被圈定在下面这条语句上:
x==2;
这是个打字错误,它的原意是一条赋值语句。程序员的手指放在“=”键上,不小心多按了一下。
这条语句成了将x与2进行比较,比较结果是true或者false,然后丢弃这个比较结果。”
这个bug事件章杉看了也是感慨万千!
尽管《C专家编程》的作者在自说自话,但章杉也深有同感。
不小心多打一个等号,手抖而已~
谁又能100%保证不会犯类似的错误呢!
说起来“=”和“==”这两个虽然看起来区分不大,但这在C语言中全然是两个不同的符号!
在C语言中,最容易产生混淆的操作符要属“=”与“==”。
其中,“=”并不等于符号,而是赋值操作符,如x=3,意味着将3赋值给x。
相对于只有一个等号的赋值操作符,关系操作符中的等于操作符采用两个等号“==”来表示。
正因如此,导致了一个潜在的问题:出于习惯,我们可能经常将需要等于操作符的地方写成赋值操作符。
或者将需要写赋值运算符的地方不小心手贱多打一个“=”
不得不说C语言的表达能力也实在是强,按照《C编程专家》一书中描述的情况,编译器对于“求一个表达式的值,但不使用该值”这样的语句竟然也能接受,并且不发出任何警告,只是简单地把返回结果丢弃。
而这种问题在实际编译的情况下并不会报错。
只能慎重又慎重!
说起来像书中所说的例子简直是比较“温柔的错误”了,有些和计算机错误相关联的事故动辄就人命关天。
章杉不止一次地听计算机系的教授说过:
在1991年2月的第一次海湾战争中,一枚伊拉克发射的飞毛腿导弹准确击中美国在沙地阿拉伯的宰赫兰基地,当场炸死28个美国士兵,炸伤100多人,造成美军海湾战争中唯一一次伤亡超过百人的损失。
在后来的调查中发现,由于一个简单的计算机bug,使基地的爱国者反导弹系统失效,未能在空中拦截飞毛腿导弹。当时,负责防卫该基地的爱国者反导弹系统已经连续工作了100个小时,每工作一个小时,系统内的时钟会有一个微小的毫秒级延迟,这就是这个失效悲剧的根源。爱国者反导弹系统的时钟寄存器设计为24位,因而时间的精度也只限于24位的精度。在长时间的工作后,这个微小的精度误差被渐渐放大。在工作了100小时后,系统时间的延迟是三分之一秒。
对一般人人来说,0.33秒是微不足道的。但是对一个需要跟踪并摧毁一枚空中飞弹的雷达系统来说,这是灾难性的——侯赛因飞毛腿导弹空速达4.2马赫(每秒1.5公里),这个”微不足道的”0.33秒相当于大约600米的误差。在宰赫兰导弹事件中,雷达在空中发现了导弹,但是由于时钟误差没有能够准确地跟踪它,因此基地的反导弹并没有发射。
本小章还未完,请点击下一页继续阅读后面精彩内容!
喜欢读书成神豪请大家收藏:(m.2yq.org)读书成神豪爱言情更新速度全网最快。