跟遗留代码打交道:干掉顽固漏洞的简单方式

事实证明,跟遗留代码打交道未必需要花费数天时间去研究晦涩难懂的注释。要想找到并修复漏洞,开发者可采用简单的测试工具来对问题抽丝剥茧。

跟遗留代码打交道会是比较困难的,尤其是如果代码是由某位不知道名字的程序员用一种不熟悉的语言编写的话。但跟据Mob Programming 的R Jason Kerney 和Llewellyn Falco的说法,遗留应用中的bug是可以相对迅速地发现和修补好的,这个过程只需要若干相当直截了当的技巧。

“我通常是没有机会去理解(遗留)代码的,所以我必须想出办法在不理解的情况下继续工作,”Falco说。

在奥兰多举行的Agile2014的一场研讨会上,Falco和Kerney展示了他们在不需要过多的研究遗留代码的情况下寻找和修补漏洞的能力。该研讨会的主题是遗留代码处置,两位程序员把有效地跟遗留代码打交道比作切芒果。芒果肉就是重要代码。其余的则是皮或者核。他们给自己的技术起了个通俗的叫法:“去皮切块”。

去皮切块法的原理是缩小焦点直至待检查的代码是与特定漏洞直接相关的。Falco解释了如何从外部开始层层剥离直至重要的代码。Kerney展示了如何在存疑的代码中切块。这样的话,很容易就可以看到哪里出了问题,知道如何去修复。

用例

他们使用了一个假设的金融应用来进行演示,该应用会在给现有记录追加信息时时产生多项新记录。大致是如果“Joe”有3笔独立的贷款,遗留代码就会为他生成3条独立的记录,每一笔贷款一条。应用应该已经给Joe原来的那条记录追加了贷款。

讨论的遗留应用假设是由捷克的外包软件团队编写的,现在这支团队已经不复存在,因此没人可以对代码做出解释。在这种设想的情况下,是没有办法可以轻松访问数据库本身的,因此也没办法通过库去了解。

难以破译的遗留代码样例

唯一知道的变量是代码执行时预期应该做什么事情,以及代码的实际执行情况。Falco和Kerney说,仅利用这一点信息,他们就可以确定遗留代码的问题出在哪里并修复问题。

代码分离

剥除代码技术要求把硬代码和重要代码分离。基本计划是把一个复杂的方法分成两部分。第一部分包含的是硬代码,第二部分包含的是我们希望理解的代码。然后把重要代码析取出来作为第二个方法,与其他代码区隔对待。

一般而言,这会需要对“代码的推拿”进行一些简单的重构,让执行顺序变得更加可行。Kerney和Falco强调,这一重构仍然是非常简单的,足以在无需理解待测遗留应用的遗留代码库的情况下就能完成。

逐块分割

往往会有部分代码不好打交道,没办法像上面那样进行分离。这些就是Falco-Kerney芒果方法论中的坑。这里就要采取切割术了,即把有问题的组件模拟出来。

Kerney使用了一种叫做EasyMock的工具来把数据库模拟出来,然后把它从不相干的东西中抽象出来。他指出这与测试驱动开发的模拟过程非常类似。区别只是前者不去检查新代码是否通过测试,而是测试现有代码中那一部分没有通过测试。

打补丁

通过首先剥除问题范围以外的代码,然后将问题范围内不相干的代码切除,Falco 和Kerney最后得到的几行代码可能就是问题所在。由于只需要聚焦于几行代码,两人就可以更好的确定什么地方出了问题。

在本例中,最后的结果表明,有两行代码写错了次序。通常情况下这两行代码的次序是没有影响的。这里出了问题是因为Java语言及其运作方式的错综复杂。

Falco和Kerney对简化后的代码运行测试时,显然是第一行代码被调用得太快了。找到正确的顺序、修订漏洞并反败为胜并没有花费太多的时间—这一切都不需要理解代码。

一点告诫

重要的是要注意到这些技术并不能保证新的依赖性错误不会发生,如果外部代码引用了被修改的代码的话。然而,正如Kerney所指出那样:“理解代码并不能确保在其身上不会出现任何连绵不绝的依赖性。”

至于在旧的遗留应用上寻找和修补漏洞,有人会提出说找出遗留代码的工作方式纯属浪费时间。不花时间学写代码的话可能会丧失掉一些(也许是可观的)学习的机会。然而,如果这种学习如果真的值得开发者花时间的话,他或她可以在漏洞解决之后再去学习代码。

看看工具

Falco和Kerney利用了面向Java的软件工具进行演示。他们使用的基础工具是Eclipse IDE、JUnit测试工具、覆盖测试用的是EclEmma,模拟对象则使用EasyMock来生成。究竟用什么工具要视具体的项目而言。

后续步骤

Llewellyn Falco针对.Net开发者解释这些过程的系列视频可以在YouTube上面找到。

你可能不想将遗留应用迁移到云上,但在云端进行开发和测试仍然有一些好处。

当你把遗留代码的所有漏洞都补上时别忘了跟踪新项目的缺陷。

时间: 2024-10-01 04:32:50

跟遗留代码打交道:干掉顽固漏洞的简单方式的相关文章

重构遗留代码(1):金牌大师

旧代码,丑陋的代码,复杂的代码,意大利面条似的代码,鬼话废话……就是四个字:遗留代码.这是一个系列文章,将有助于你处理并解决它. 在理想的世界中,你只会写新代码.你会把代码写得既漂亮又完美.你将永不会再看你的代码,并且你将永远不会维护一个有十年之久的项目.在理想的世界中… 不幸的是,我们生活在现实的而非理想的世界.我们必须理解修改和增强年代久远的代码这件事.我们必须处理遗留代码.那么你还在等什么?让我们一头扎进第一篇教程,拿着代码,读懂一点点,并为了我们日后的修改编织一张安全网. 遗留代码的定义

遗留代码的测试

遗留代码的测试 在大多时候代码的测试很难,因为很多代码无法进行参数注入,那么这个时候有一款不受限的隔离框架TypeMock供你使用,不过遗憾这款软件是付费的一个隔离框架,有15天的免费使用权,如果能解决你现有的问题我想这份费用并不能算多.TypeMock的官方下载http://www.typemock.com/.下面开始看看TypeMock是怎么样使用的. 1:伪造一个静态的方法来看一个例子 被测试的静态方法 public static int DoSomethingSpecialOnALeap

对历史遗留代码的维护和再开发

一.时间宽松时的代码维护 对于新人,一般都会留出一段时间进行代码的接手,那么对于如何处理接到手中的代码,是不是只是看看代码.写写心得,还是能够利用这段空闲时间,煅炼提升自己,我期望是后者,结合公司部门的情况,对这种情况进行个人阐释: 1.对现有代码的熟悉.若是对拿到手中的代码,都不知道是做什么的,有什么用,可能就什么意义也没有,后面的也不用看了. 2.加入或者补充测试用例,若是没有测试用例,后面的重构基本上是没办法进行判断是否正确的. 3.用测试用例对代码进行测试,以期达到相关效果和理解代码逻辑

应用MVP模式对遗留代码进行重构

AV(Autonomous View)自治视图 在面向终端用户的应用中,都需要一个可视化的UI来与用户交互.这个UI称为View视图. 在早期,我们习惯将所有前台的逻辑,与视图揉在一起,称为AV自治视图. 这些逻辑包括:数据呈现(Display),用户动作的扑捉与响应,数据存储等. 在.Net的Winform和ASP.NET Web Form中,采用的都是事件驱动模型. AV是将所有UI相关的逻辑都注册到视图本身,或者视图元素对应的事件上. 人机交互应用的3个关注点. 数据在UI上的展示. UI

读《软件驱魔》调试和优化遗留代码的艺术

读<软件驱魔> 调试和优化遗留代码的艺术 软件维护方法论的书,其间还有作者的感悟,读起来情深意切啊 此书中文版,第一版是2014年5月 内容给人感觉作者早已成书多年了.但软件知识还是有不过时的东西. 软件发展到现在,在我们身边,已经可以发生着许多书中的故事. 如大量的历史代码无人维护或者是开发人员不可寻且没有文档,没有流程图等等. 在这种情况下,作者指点读者去如何做更有益. 用了许多方法,并科学的介绍了不只一种方法. 收益良多. 还介绍了可能会出现的人员交流的问题.这种问题我在工作中也是常遇到

Java字符代码中干掉制表符、回车符和换行符

Java字符代码中干掉制表符.回车符和换行符 代码片段: String sql = StringUtils.trim(sql).replaceAll("[\\r\\n\\t]","");//干掉空格和换行符以及制表符; 说明:String类的replaceAll就有正则替换功能. \t为制表符 \n为换行 \r为回车

遗留代码

关键词:遗留代码,代码修改,测试 概述 从其他人或者其他版本获得的代码. 特点 架构设计差 代码风格不一致 文档少和模糊 非常有价值,成功代码 修改遗留代码原因 新功能 Bug 重构 优化 修改 Risky change 修改风险 What changes do we have to make? 哪些是必须修改的内容 How will we know that we've done them correctly? 修改正确吗 How will we know that we haven't br

对遗留代码的解依赖技术

参数适配 使用场景:当无法对一个参数的类型使用接口提取,或者该参数难以被"伪装"时. 例如,该参数的类型是一个含有很多方法的接口类型.在进行单元测试时必须编写一个实现该接口的实现类. 可以使用Mock. 问题:从维护的角度来看,传递了一个宽接口,而其实方法内部只使用了该接口的部分契约. 所以,应该尽量使用窄接口来替代宽接口. 分解出方法对象 使用场景:若方法规模太大,或者使用了实例变量或者其他方法. 将大方法移到一个新类中,因为该类仅含有一个方法成员,所以称为方法对象. 可以方便地对方

Android中WebView的JavaScript代码和本地代码交互的三种方式

一.Android中WebView的漏洞分析 最近在开发过程中遇到一个问题,就是WebView使用的时候,还是需要解决之前系统(4.2之前)导致的一个漏洞,虽然现在这个系统版本用户很少了,但是也不能忽视,关于这个漏洞,这里就不多做解释了,可能有的同学早就了解了,本来想写一篇文章详细介绍一下,但是网上的知识太多了,而且都很详细,就没弄了,这里大致简单明了的说几句: 第一.漏洞产生的原因 这个漏洞导致的原因主要是因为Android中WebView中的JS访问本地方法的方式存在缺陷,我们做过交互的都知