阅读更多

1顶
1踩

非技术

原创新闻 程序员最恐怖的梦魇是什么?

2015-12-03 10:25 by 副主编 mengyidan1988 评论(1) 有6088人浏览



这是Quora上的一个问题,其中Mick的回答获得了13.5k的“赞同”,他是这么回忆的:

曾经有位心理学的博士雇我查一个BUG,程序是他的一个学生写的,经常会出现奇怪的输出。程序的功能是,从文件中读取数据,提出50个问题,进行一系列计算,然后基于这位博士的研究来得出一个分数。程序跑在大学的一台3B2上。他给我演示了程序,确认这个Bug可以重现——每次在问题之间切换的时候,总会闪出一些奇怪的字符。我觉得这应该很简单,所以答应了他,并且我们同意按小时付费。

Day1
我来到这台3B2面前,用那个学生的帐号登录,找到了用C写的源代码,并开始测试。代码可读性非常差,所有的代码都写在了一行,变量名都是三个字母,而且还是随机组合的!真庆幸我当初选择按小时收费。我把代码格式化为习惯的风格,这样看起来多少还能读。

做完之后,我用curses库移到屏幕上一个点,打印一个问题和答案,然后等待回应。但是在打印出第一行之后,出现了一些乱码,过了大约1/2秒之后,乱码被问题覆盖掉。这个问题应该很容易解决,只有五个地方需要打印信息,所有的地方都出现了一闪而过的乱码。小意思,只要删掉mvpwintw()应该就ok了。我删掉之后开始编译,觉得问题差不多解决了。但是运行的时候,干扰信息又出现了!只是乱码变了,但是症状还是一样!

我检查了一下代码,发现竟然回到了我改之前的样子!15个文件,混乱的格式,三个字母的变量。当初为什么不备份一下代码呢,真想射自己一枪。我再一次格式化它们,这次把代码放到三个文件中,以不同的名字命名。然后备份了整个文件夹,并且将权限设置为只读。编译之后,一切正常。一运行,这个文件夹中又出现了15个文件!我改过之后的源代码没有被删除,然后干扰信息又回来了。

我明白了,这一定是在硬盘的某个地方的代码,在编译的时候会将程序添加到我修改的代码中去。所以我准备搜索一下include区域(/usr/include),因为我们用的是研究的版本,所以除了kernel别的代码都在机器上。头文件太多了,所以在3B2上搜索需要花一些时间。以上,就是第一天的工作了。

Day2
从磁盘的搜索中没有得到什么结果,这说明这些乱码要么是被加密了,要么就是在lib中的某个地方。但是我没有搜到,我决定搜索所有的文本文件,这次花的时间比昨天更长,第二天就这这样过去了。

Day3
没有结果。字符串是加密的。我只好根据所有的头文件来一点一点查了。这会花费相当多的时间,我们同时还警告了学校,可能有人得到了Phelps博士计算机的root权限。但他们却对此并不关心,可能只是一台实验室的计算机吧。

我打开#include文件,却没有发现代码。后来发现这些都被编译成一个文件了。也没什么关系,毕竟我们有源代码,大不了就重新编译所有的库。

Days4-6
接下来是最难的部分了,我们好不容易向学校的书呆子说明了问题。然后让Mark(我觉得他能做Unix管理员完全是因为娶了Dean的女儿)开始学习编译。最后他终于同意交给我来做,因为他什么都不会。在第6天最后,编译工作终于完成了。

我拿出修改之后的代码,重新开始编译。一切正常,然后我运行了一下,天呐!这问题又出现了。源代码分成了15个文件,干扰信息又出来了。简直跟魔法一样,我觉得自己被打败了,问题肯定不在源代码里。Phelps博士也有点不乐意了,他觉得这么长时间,即使重新写一个也该完成了。“当然”,我失落地说,“你是对的,说不定重写比较好。”“好的,我们明天开始重写。”博士说。

Day7
见鬼去吧,我不会认输的!我跟Phelps博士说:“你不用付给我钱了,只要给我时间,我一定要找到这个bug。”

Days8-14
我学聪明了,他一定是修改了一些库,我开始研究编译出来的汇编(虽然我之前根本就不懂汇编),从开始学习,到最后看懂汇编代码,花了六天。虽然根本没发现什么异常,完全就是在浪费时间。

Day 15
突然,我意识到,问题可能出在编译器上,一定是。每次编译代码的时候,编译器就会往源代码中添加干扰信息。我以前也听说过这种情况。

啊耶!我找到了!我们也有编译器的源代码,我查了一下,谢天谢地,终于找到了。编译器链接器中的代码是这样的:

1)检测所有对fopen()的调用,在打开的文件中查找Phelps博士的问题,如果找到
2)编译的时候,重写15个文件
3)使用这15个文件编译博士的程序,在链接的时候会输出-o形式的名字

编译器被这个学生修改了,以便往Phelps博士的程序中添加代码。

几天之后,AT&T的技术支持提供了原版的编译器和链接器代码,我们重新编译,替换了被修改的编译器和链接器。

但是,问题还没有解决。编译器被其他我们没有的源代码污染了。这些代码存在于现在可执行的编译器中,在编译编译器的时候,会加入污染代码。但是它并不修改/usr/src中的代码,而是将其复制到一个隐藏文件夹,修改编译器源代码,编译,最后删除隐藏文件夹。AT&T发现这个问题花了好长时间。这个学生修改了编译器,让编译器重新编译的时候加入污染代码。最后我们不得不从另一台3B2机器上复制过来编译器的字节码文件版本,才终于解决这个问题。

通过编译器的代码我们还发现,如果编译/sbin/login的话会加入一些后门代码,可以允许任何人使用特定的密码来登入root。这台电脑可以通过调制解调器或Tymnet接入。终于,这件事引起了校方注意。

这人真是个天才,不过,也太恐怖了!

其他网友回答
  • Bug只在产品中有,开发版本中却没有或者不可重现
  • bug触发的几率很小很小,却又不能小到可以忽视
  • 去改不是你写的代码中的bug,原来写代码的这家伙已经离职了
  • 发生bug的地方是99.9%可靠的库,是你绝对不会怀疑的地方
  • 几年来很多人尝试去修改的bug,但是没有人成功过
  • 存在逻辑错误的bug,只有在运行一段时间之后才会触发
  • debug需要特定领域的知识,正是你不懂的
  • debug的deadline很紧
  • Stack Overflow挂了
  • 在Stack Overflow上搜索问题,发现有人一年前问了同样的问题,但是没有人 回答。
  • 分号键失灵
  • 看自己一年以前的代码,有种“这真他妈是我写的”的感觉
  • 库没有文档
  • 客户又改需求了
  • ==写成了=
  • IE(如果你做前端)
  • Github merge冲突
  • 在错误的目录下 rm -rf
  • “My code works, I don’t know why”(这句话不需要翻译了)
  • 开会,开会,开会……作为程序员让我去死吧

那么,你的噩梦又是什么呢?
  • 大小: 526.2 KB
来自: 极客头条
1
1
评论 共 1 条 请登录后发表评论
1 楼 ray_linn 2015-12-07 12:37
为啥不用个类似 Filemonitor的工具?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 欧洲杯

    最后一次晚上爬起来看球,欧洲杯终于结束了。 比赛很沉闷,唯一的收获是:奇迹终于发生了。 人生的奇迹呢?!

  • 程序员最恐怖的梦魇

    接下来是最难的部分了,我们好不容易向学校的书呆子说明了问题。然后让Mark(我觉得他能做Unix管理员完全是因为娶了Dean的女儿)开始学习编译。最后他终于同意交给我来做,因为他什么都不会。在第6天最后,编译工作...

  • 程序员天生就怪怪的么?

    我最近阅读了 Eric Spiegel 在 Slashdot上写的一篇博客,他提出了这么一个疑问:“软件开发者/程序员天生就怪怪的么?”我仔细地想了想,然后发现每个在IT领域工作的人都多少有点怪异。所以我在这里附议一下Eric的...

  • 饭谈:失眠,还有梦魇,第二天要上班应该怎么办?

    各位晚上好,最近几大粉丝群都不约而同的讨论起晚上失眠怎么治疗的这件事,其实对于我们这种工作压力大的程序员来说,失眠,梦魇都是常事。        看了眼公众号,发现半夜...

  • 程序员的五种不同寻常的特质

    程序员身上有很多特质,用通俗点的话说,是“易黑体质”,但同时优秀程序员也有很多体质。因此,如果你认为自己缺少下面的某些品质,千万别往心里去。不是一时兴起才来探讨这些,其中的很多迹象来自于对其他程序猿的...

  • 程序员讨论《黑客帝国》(一)真实与虚拟

    大概大家小时候都有梦魇的经历,一旦发烧或者特别累,就会哭闹,脑海里会出来各种恐怖但又说不清的东西,无论如何就是要起床去“做什么”,父母怎么压都压不住。让我印象最深刻的是98年我和父母爬完庐山,在庐山疗养...

  • 程序员如何进行用户界面设计

    程序员设计的用户界面,其实大多数并不是一个好的界面,很多人写代码时,以为这样的功能比较强大应该加上去,那样的接口比较灵活应该加上去,可是往往到头来用户只用其中的一点功能,并且会有很多用户认为很难懂、很...

  • Lisp真的是屠龙之技吗?

    老人看透了他的心思,犀利的目光直视他漆黑的眸子:“这就是所谓最伟大的程序员吗?” “我不必懂得机器!”他梗着脖子,“我甚至不必懂得机器语言,我不喜欢粗陋生硬的二进制。” “跪下!”老人在背后狠狠地踢...

  • 大龄非专业程序员的觉悟:出来混,迟早要还的,现在觉得要学的东西越来越多了!

    最恐怖的是这些东西不光我能学,稍微基础好点的新人,他们也能学,甚至还比我学得快,我觉得我随时都有被换掉的可能性,即使我经验再丰富,如果在项目中用不到,那就不能完全体现我的价值,这让我觉得自己跟新人比...

  • 今时今日,C还适合当下之所需么?

    它不仅仅运行时是最快的,其内存使用与启动时间也是效率最高的。如果需要在空间与时间上进行折衷,那么C并不会对你隐藏任何细节信息,我们可以很容易地做出估计”。 更快的开发周期 ——“对于开发者效率与生产力来...

  • 基于OpenGL的C语言的魔方项目.zip

    C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得

  • QT-qtablewidget表头添加复选框QHeaderView

    在 Qt 框架中,要在 QTableWidget的表头中添加复选框,可以通过继承 QHeaderView 并重写 paintSection 方法来实现。 介绍一种继承 QHeaderView的方法分别实现QTableWidget中添加复选框,可全选/全不选/部分选。

  • 分段划线测量表格通用版.doc

    分段划线测量表格通用版.doc

  • 扫雷小游戏(JAVA SE).zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

  • 啊哈算法哈磊基于队列的优化Bellman-ford算法搜索单源最短路径-Java实现

    本资源源自《啊哈算法》的高级算法实践,专注于讲解基于队列优化的Bellman-Ford算法在单源最短路径问题上的应用,并提供了Java语言的实现代码。哈磊老师以其独特的教学视角,不仅详细解析了传统Bellman-Ford算法的原理及其在处理含有负权边图中的优势,还深入介绍了如何通过队列优化(通常指SPFA算法)来加速这一过程,减少不必要的松弛操作,提高算法效率。 Java实现部分,代码实现清晰,注释详尽,从初始化距离数组、设置源节点开始,逐步展示如何维护一个队列来记录待检查的顶点,并通过队列进行有效的顶点遍历和松弛操作。本资源通过实例演示了如何高效地更新路径长度,检测负权环,并最终确定从源点到图中所有其他顶点的最短路径。 这份资源特别适合对图算法有深入学习需求的学生、工程师以及算法爱好者,尤其是那些关注算法性能优化和实际应用的人士。通过学习这份资源,你不仅能掌握Bellman-Ford算法的核心逻辑,还将理解如何通过队列优化策略提升算法的执行效率,为解决复杂的网络最短路径问题提供有力工具。在算法学习和软件开发的道路上,这将是一块宝贵的垫脚石,助你攀登更高的算法高峰。

  • 基于一阶倒立摆线性二次型最优控制

    基于一阶倒立摆线性二次型最优控制

  • Java课程设计,做个扫雷游戏.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

  • 计算机毕业设计-asp网上体育用品商店的设计与实现(LW+源代码).zip

    计算机毕业设计资源包含(项目部署视频+源码+LW+开题报告等等),所有项目经过助教老师跑通,有任何问题可以私信博主解决,可以免费帮部署。

  • springboot学生考勤系统.rar

    基于Java的教师考勤管理系 统 成绩查看 请假申请 考勤管理 用户 注册登录 个人中心 系统管理 学生管理 管理员 老师管理 成绩管理 考勤信息管理 请假信息管理 个人中心 公告管理 个人中心 学生考勤管理 教师 学生请假申请管理 成绩管理 班级管理 公告管理

Global site tag (gtag.js) - Google Analytics