一个空格引发的惨剧

一个空格引发的惨剧

你是否相信如果你的程序里没有检查一个变量会导致怎么系统瘫痪?无论你相不相信,这是我一个亲身经历过的案例,你可以在本站的程序员那些悲催的事儿中找到很多这样的事。这样的事昨天在发生,今天同样在发生。Unix40多年了,在这40年里,程序员发生过各种各样的的惨剧,但是大多数的事情一而再再而三的重演。

今天的你,可能在开发者各种各样NB的系统,你会相信你的一个空格也能导致系统瘫痪吗?也许你可能很难相信这个事。不过,再下面这个事将告诉你这个血淋淋的事实 —— 一个空格产生的bug可以让你的系统瘫痪。

bumblebee是一个开源项目,这个名字也就是变形金刚里的大黄蜂,这个项目是这样介绍自己的——

bumblebee is Optimus support for Linux, with real offloading, and not switchable graphics.. More important.. it works on Optimus Laptops without a graphical multiplexer..

Optimus 是NVIDIA的“优驰”技术,其可以将您的笔记本电脑PC提升到绝佳状态,提供出色的图形性能,并在需要时延长电池续航时间。这个项目是把这个技术移到Linux上来。

这个项目本来不出名,不过,程序在其安装脚本install.sh里的一个bug让这个项目一下子成了全世界最瞩目的项目,这个bug的fix如下:

@@ -348,7 +348,7 @@ case "$DISTRO" in
-  rm -rf /usr /lib/nvidia-current/xorg/xorg
+  rm -rf /usr/lib/nvidia-current/xorg/xorg

看明白了吗?空格。这个空格会导致什么样的问题呢?呵呵。你有没有感到菊花一紧?这个bug绝对的霸气外露!真是验证了“如何写出无法维护代码”的那句话——“测试你的程序是一种懦夫的行为”。

不过,最精彩还不是这个bug,而是全世界程序员的对这个bug 的 code review comments,真的相当的欢乐。请强势围望!

https://github.com/MrMEEE/bumblebee/commit/a047be85247755cdbe0acce6#diff-1

重点是其中的很多图片——下面的图片众多。

clip_image001


clip_image002

clip_image007

clip_image010

clip_image011

clip_image012

clip_image014

clip_image016

clip_image019

clip_image020

clip_image021

(全文完)

(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)

好烂啊有点差凑合看看还不错很精彩 (28 人打了分,平均分: 3.89 )
Loading...

一个空格引发的惨剧》的相关评论

  1. 作为程序员, 我很同情这位老兄, 估计自责的死的心都有了。

    不过, 发布之前不安装测试一下, 也实在是…

  2. 这哥们的太搞了。
    So epic!
    But this is better than rm -rf / usr/lib/nvidia-current/xorg/xorg :)

  3. 让我想起前同事(一个QA)的悲剧,他在rm -rf后习惯性地按了“y“确认,等到他意识到发生什么时,手指已经在往回提了。

  4. 古人云「君子不立危墙」,又云「瓜田不纳履,李下不整冠」,讲的都是避免使自己处于危险的境地。如果你有一条可以吊死自己的绳子,那么就不要随便打个结挂起来。rm 就是这条绳子,用他妈补全会死么?

  5. 呵呵,对于rm我也犯过同样的错误,都是一时手快加了个空格。那时候正在维护公司的svn repository,一个rm -rf /svn/ uselessproject 把公司的所有项目给删除了。从此以后每回打rm -rf心里总要哆嗦一下,确保无误之后才敢摁回车。

  6. 杯具的还有,一个公司的网管手欠,做了个 chmod 777 /* -R ,我勒个去,害的我折腾了30分钟给他修复,那可是他们公司的正在运行的服务器啊…

  7. 陈Sir,扯个题外话。关于写代码速度问题。
    我这两天给企业做了个模块,从开始做到按照需求自测通过,花费一天时间。代码行数1K左右的样子。
    请问这个速度是否过于慢了?
    区区大二,想做点真正的东西

    1. 关键不是写多少,关键也不是写多快,重要的是写的代码质量怎么样?不过,如果从最一般的感觉来看,1天写1000行代码算是高产了。

  8. 陈皓 :
    关键不是写多少,关键也不是写多快,重要的是写的代码质量怎么样?不过,如果从最一般的感觉来看,1天写1000行代码算是高产了。

    绝对的高产啊

  9. @陈皓
    我曾经听说,一个“合格”的程序员,每周产量应当是“5000”行。
    而我又听说,一个程序员,每天有效工作时间为4小时(《UML面向对象建模基础》中国水利水电出版社)而实际上我一天写代码或者调试时间大约为16小时
    所以感觉压力很大啊

  10. @陈皓
    真的?代码产量不用那么高是吧?
    心理压力一直有点大。。
    当然,也可能是我理解老师和书的意思有所偏差。

    另外,关于统一问题。
    windows环境下,我在使用文件操作的时候,大多数用的是非 windows api里的东西,但个别的东西,比如查看硬盘剩余容量——我实在不知道不用windows api以外还能用什么函数了(只是我不知道,并且没找到,不敢说不存在),所以就使用了GetDiskFreeSpaceEx这个函数。
    而其他比如删除文件什么的,我用的却是 remove()而不是DeleteFile()。而查看文件长度用的是struct stat buffer;
    在软件行业中,是否存在那么一个“潜规则”之类的东西,要求用某个固定系列的函数什么的?
    感觉自己这么做有点乱来啊

  11. @Walkerinwind
    我感觉吧:
    1) 如果不是自己得心应手的方式方法,即使照做,而且顺利完成了,也不会有自信的;
    2) 如果是自己的心应手的方式方法,做完一点就多一点自信,即使做坏了,要找出自己的方式方法错在哪里,也会比照搬别人的方式方法来的容易得多,等自己的方式方法被纠正过来了,就更加有自信了。

  12. @Walkerinwind
    我觉得 Walkerinwind 问的这些问题不是技术问题,而是社会经验的问题。Walk君勤学的同时如果能融会贯通,不照本宣科,一定大有作为。

  13. http://iregex.org/blog/safer-rm-command.html

    #safe remove, mv the files to .Trash with unique name
    #and log the acction
    function rm()
    {
    trash=”$HOME/.Trash”
    log=”/var/log/trash.log”
    stamp=`date “+%Y-%m-%d %H:%M:%S”` #current time

    while [ -f “$1” ]; do

    #remove the possible ending /
    file=`echo $1 |sed ‘s#\/$##’ `

    pure_filename=`echo $file |awk -F / ‘{print $NF}’ |sed -e “s#^\.##” `

    if [ `echo $pure_filename | grep “\.” ` ]; then
    new_file=` echo $pure_filename |sed -e “s/\([^.]*$\)/$RANDOM.\1/” `
    else
    new_file=”$pure_filename.$RANDOM”
    fi

    trash_file=”$trash/$new_file”
    mv “$file” “$trash_file”

    if [ -w $log ]; then
    echo -e “[$stamp]\t$file\t=>\t[$trash_file]” |tee -a $log
    else
    echo -e “[$stamp]\t$file\t=>\t[$trash_file]”
    fi

    shift #increment the loop
    done
    }

  14. 默哀—–
    rm -rf /usr 不知有几人中招

    这让我想起当年在VMware中为Red Hat 9.0升级内核到2.6.20.8,第一次失败后重编译,在/boot下产生一些.old文件,看起来很不顺眼,于是想在/boot下敲入rm -rf *.old,一时手快成了rm -rf *
    当时傻了

  15. rm命令害人不浅啊。以前辛苦一天的调试,结果 rm -rf 删错了,真的是欢乐开怀啊

  16. @Mike Ma
    正在养成……半个月前我刚被坑一次……连上adb然后不小心在/sdcard下rm -rf *然后恢复数据耗了我一下午……

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注