翻页   夜间
乐书网 > 读书成神豪 > 第195章 IOCCC

    天才一秒记住本站地址:[乐书网] https://www.leshuxs.org/最快更新!无广告!

    章杉留意到《C专家编程》里面提到了一个奇怪的大赛——国际C语言混乱代码大赛。

    出门右拐度娘了一下:

    国际C语言混乱代码大赛(IOCCC,TheInternationalObfuscatedCCodeContest)是一项国际编程赛事,从1984年开始,每年举办一次(1997年、1999年、2002年、2003年和2006年例外)。目的是写出最有创意的最让人难以理解的C语言代码。

    章杉:Σ(っ°Д°;)っ

    居然还特么真的有这个比赛?而且还是国际编程赛事???

    IOCCC是由蓝登·克特·诺尔(LandonCurtNoll)与拉里·贝索(LarryBassel)在1984年受雇于国家半导体(NationalSemiconductor)的Genix程序移殖事业群时开始的。比赛的点子是来自他们俩比较彼此有关于它们得修正的某些写得很烂代码的笔记。

    每年,IOCCC的比赛规则会张贴在其网站上。规则每年不同,并且会随附上一组的指导方针以试图表达规则的精神。

    这些规则通常是蓄意书写成文,伴随着精巧的漏洞让参赛者有所鼓励去发现并滥用。

    啧,虽然听起来不太入流,但章杉觉得有必要还是可以参加一下的!

    趣味性十足有木有~

    书里面倒也不全是有趣的东西,有些东西很沉重!

    在《C专家编程》这本书中,章杉看到了这样一个例子:

    【看书领红包】关注公众号【书友大本营】看书抽最高888现金红包!

    “1993年春天,在SunSoft的操作系统开发小组里,我们(《C专家编程》作者)接到了一个“一级优先”的Bug报告,是一个关于异步I\/O库的问题。

    如果这个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米的误差。在宰赫兰导弹事件中,雷达在空中发现了导弹,但是由于时钟误差没有能够准确地跟踪它,因此基地的反导弹并没有发射。

    类似的事故还有1996年6月份的阿丽亚娜火箭事件。

    程序员在编程时必须定义程序用到的变量,以及这些变量所需的计算机内存,这些内存用比特位定义,一个16位的变量可以代表32,768到32,767中间的值(这个数值的由来是2151)。

    而一个64位的变量可以代表?9.223.372.036.854.775.808到9.223.372.036.854.775.807中间的值。

    1996年6月4日,阿丽亚娜5型运载火箭的首次发射点火后,火箭开始偏离路线,最终被逼引爆自毁,整个过程只有短短30秒。

    阿丽亚娜5型运载火箭基于前一代4型火箭开发。在4型火箭系统中,对一个水平速率的测量值使用了16位的变量及内存,因为在4型火箭系统中反复验证过,这一值不会超过16位的变量,而5型火箭的开发人员简单复制了这部分程序,而没有对新火箭进行数值的验证,结果发生了致命的数值溢出。

    发射后这个64位带小数点的变量被转换成16位不带小数点的变量,引发了一系列的错误,从而影响了火箭上所有的计算机和硬件,瘫痪了整个系统,因而不得不选择自毁,4亿美金变成一个巨大的烟花。

    俱往矣!

    感慨之余,章杉及时在系统进行了结算:

    说起来虽然章杉读书的速度很快,但还是用了3个小时才将这本书搞定!

    “叮~宿主共读书3个小时,累计获得金钱21600元,累计获得43200经验(含Ⅱ号徽章加成)”

    “另外宿主共阅读43万字,累计收获43万元软妹币~”

    “目前系统等级为12级,升级所需经验为7,097,461\/204,800,000”
章节错误,点此报送(免注册), 报送后维护人员会在两分钟内校正章节内容,请耐心等待。