压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

跟遺留代碼打交道:干掉頑固漏洞的簡(jiǎn)單方式

  事實(shí)證明,跟遺留代碼打交道未必需要花費(fèi)數(shù)天時(shí)間去研究晦澀難懂的注釋。要想找到并修復(fù)漏洞,開發(fā)者可采用簡(jiǎn)單的測(cè)試工具來對(duì)問題抽絲剝繭。

  跟遺留代碼打交道會(huì)是比較困難的,尤其是如果代碼是由某位不知道名字的程序員用一種不熟悉的語(yǔ)言編寫的話。但跟據(jù)Mob Programming 的R Jason Kerney 和Llewellyn Falco的說法,遺留應(yīng)用中的bug是可以相對(duì)迅速地發(fā)現(xiàn)和修補(bǔ)好的,這個(gè)過程只需要若干相當(dāng)直截了當(dāng)?shù)募记伞?/p>

  “我通常是沒有機(jī)會(huì)去理解(遺留)代碼的,所以我必須想出辦法在不理解的情況下繼續(xù)工作,”Falco說。

  在奧蘭多舉行的Agile2014的一場(chǎng)研討會(huì)上,F(xiàn)alco和Kerney展示了他們?cè)诓恍枰^多的研究遺留代碼的情況下尋找和修補(bǔ)漏洞的能力。該研討會(huì)的主題是遺留代碼處置,兩位程序員把有效地跟遺留代碼打交道比作切芒果。芒果肉就是重要代碼。其余的則是皮或者核。他們給自己的技術(shù)起了個(gè)通俗的叫法:“去皮切塊”。

  去皮切塊法的原理是縮小焦點(diǎn)直至待檢查的代碼是與特定漏洞直接相關(guān)的。Falco解釋了如何從外部開始層層剝離直至重要的代碼。Kerney展示了如何在存疑的代碼中切塊。這樣的話,很容易就可以看到哪里出了問題,知道如何去修復(fù)。

  用例

  他們使用了一個(gè)假設(shè)的金融應(yīng)用來進(jìn)行演示,該應(yīng)用會(huì)在給現(xiàn)有記錄追加信息時(shí)時(shí)產(chǎn)生多項(xiàng)新記錄。大致是如果“Joe”有3筆獨(dú)立的貸款,遺留代碼就會(huì)為他生成3條獨(dú)立的記錄,每一筆貸款一條。應(yīng)用應(yīng)該已經(jīng)給Joe原來的那條記錄追加了貸款。

  討論的遺留應(yīng)用假設(shè)是由捷克的外包軟件團(tuán)隊(duì)編寫的,現(xiàn)在這支團(tuán)隊(duì)已經(jīng)不復(fù)存在,因此沒人可以對(duì)代碼做出解釋。在這種設(shè)想的情況下,是沒有辦法可以輕松訪問數(shù)據(jù)庫(kù)本身的,因此也沒辦法通過庫(kù)去了解。

  難以破譯的遺留代碼樣例

  唯一知道的變量是代碼執(zhí)行時(shí)預(yù)期應(yīng)該做什么事情,以及代碼的實(shí)際執(zhí)行情況。Falco和Kerney說,僅利用這一點(diǎn)信息,他們就可以確定遺留代碼的問題出在哪里并修復(fù)問題。

  代碼分離

  剝除代碼技術(shù)要求把硬代碼和重要代碼分離。基本計(jì)劃是把一個(gè)復(fù)雜的方法分成兩部分。第一部分包含的是硬代碼,第二部分包含的是我們希望理解的代碼。然后把重要代碼析取出來作為第二個(gè)方法,與其他代碼區(qū)隔對(duì)待。

  一般而言,這會(huì)需要對(duì)“代碼的推拿”進(jìn)行一些簡(jiǎn)單的重構(gòu),讓執(zhí)行順序變得更加可行。Kerney和Falco強(qiáng)調(diào),這一重構(gòu)仍然是非常簡(jiǎn)單的,足以在無需理解待測(cè)遺留應(yīng)用的遺留代碼庫(kù)的情況下就能完成。

  逐塊分割

  往往會(huì)有部分代碼不好打交道,沒辦法像上面那樣進(jìn)行分離。這些就是Falco-Kerney芒果方法論中的坑。這里就要采取切割術(shù)了,即把有問題的組件模擬出來。

  Kerney使用了一種叫做EasyMock的工具來把數(shù)據(jù)庫(kù)模擬出來,然后把它從不相干的東西中抽象出來。他指出這與測(cè)試驅(qū)動(dòng)開發(fā)的模擬過程非常類似。區(qū)別只是前者不去檢查新代碼是否通過測(cè)試,而是測(cè)試現(xiàn)有代碼中那一部分沒有通過測(cè)試。

  打補(bǔ)丁

  通過首先剝除問題范圍以外的代碼,然后將問題范圍內(nèi)不相干的代碼切除,F(xiàn)alco 和Kerney最后得到的幾行代碼可能就是問題所在。由于只需要聚焦于幾行代碼,兩人就可以更好的確定什么地方出了問題。

  在本例中,最后的結(jié)果表明,有兩行代碼寫錯(cuò)了次序。通常情況下這兩行代碼的次序是沒有影響的。這里出了問題是因?yàn)镴ava語(yǔ)言及其運(yùn)作方式的錯(cuò)綜復(fù)雜。

  Falco和Kerney對(duì)簡(jiǎn)化后的代碼運(yùn)行測(cè)試時(shí),顯然是第一行代碼被調(diào)用得太快了。找到正確的順序、修訂漏洞并反敗為勝并沒有花費(fèi)太多的時(shí)間—這一切都不需要理解代碼。

  一點(diǎn)告誡

  重要的是要注意到這些技術(shù)并不能保證新的依賴性錯(cuò)誤不會(huì)發(fā)生,如果外部代碼引用了被修改的代碼的話。然而,正如Kerney所指出那樣:“理解代碼并不能確保在其身上不會(huì)出現(xiàn)任何連綿不絕的依賴性。”

  至于在舊的遺留應(yīng)用上尋找和修補(bǔ)漏洞,有人會(huì)提出說找出遺留代碼的工作方式純屬浪費(fèi)時(shí)間。不花時(shí)間學(xué)寫代碼的話可能會(huì)喪失掉一些(也許是可觀的)學(xué)習(xí)的機(jī)會(huì)。然而,如果這種學(xué)習(xí)如果真的值得開發(fā)者花時(shí)間的話,他或她可以在漏洞解決之后再去學(xué)習(xí)代碼。

  看看工具

  Falco和Kerney利用了面向Java的軟件工具進(jìn)行演示。他們使用的基礎(chǔ)工具是Eclipse IDE、JUnit測(cè)試工具、覆蓋測(cè)試用的是EclEmma,模擬對(duì)象則使用EasyMock來生成。究竟用什么工具要視具體的項(xiàng)目而言。

  后續(xù)步驟

  Llewellyn Falco針對(duì).Net開發(fā)者解釋這些過程的系列視頻可以在YouTube上面找到。

  你可能不想將遺留應(yīng)用遷移到云上,但在云端進(jìn)行開發(fā)和測(cè)試仍然有一些好處。

  當(dāng)你把遺留代碼的所有漏洞都補(bǔ)上時(shí)別忘了跟蹤新項(xiàng)目的缺陷。

 

上一篇:智能無懼挑戰(zhàn) 山石網(wǎng)科轟動(dòng)RSA2015

下一篇:GTA 5在線:黑客通過Money Mods盜取游戲玩家的錢和武器裝備