今天的軟件開(kāi)發(fā)團(tuán)隊(duì)承受著巨大的壓力;市場(chǎng)對(duì)高質(zhì)量、安全版本的需求不斷加快,而安全威脅也變得越來(lái)越復(fù)雜。考慮到產(chǎn)品故障和安全漏洞的高成本,在整個(gè)軟件開(kāi)發(fā)過(guò)程中解決這些風(fēng)險(xiǎn)比以往任何時(shí)候都更加重要。需要盡早發(fā)現(xiàn)潛在問(wèn)題,以防止發(fā)布延遲或更糟糕的是,發(fā)布后失敗。
幸運(yùn)的是,有許多工具可以幫助開(kāi)發(fā)人員管理這些風(fēng)險(xiǎn),幫助在開(kāi)發(fā)階段早期識(shí)別潛在問(wèn)題,此時(shí)問(wèn)題的破壞性較小且更容易修復(fù)。開(kāi)發(fā)人員可以輕松訪(fǎng)問(wèn)它們,并且在許多開(kāi)發(fā)環(huán)境中易于使用。這適用于使用任何語(yǔ)言進(jìn)行編程的開(kāi)發(fā)人員;但是,我們?cè)诒敬斡懻撝嘘P(guān)注 Java。
靜態(tài)分析有助于降低風(fēng)險(xiǎn)
在考慮 Java 或其他方面的靜態(tài)分析工具時(shí),了解這些工具是什么很重要。術(shù)語(yǔ)“靜態(tài)分析”是指在不執(zhí)行程序的情況下分析程序的方法。正如我們將在下一節(jié)中看到的,靜態(tài)分析工具可用于生成從編碼標(biāo)準(zhǔn)違規(guī)到特定錯(cuò)誤或漏洞的任何報(bào)告。簡(jiǎn)而言之,靜態(tài)分析工具分析源代碼以找到對(duì)管理風(fēng)險(xiǎn)有用的信息。
靜態(tài)分析的一個(gè)好處是它可以在開(kāi)發(fā)周期的早期執(zhí)行,通常在應(yīng)用程序執(zhí)行之前。它通常集成到自動(dòng)構(gòu)建中,因此幾乎沒(méi)有運(yùn)行頻繁分析的開(kāi)銷(xiāo)。通過(guò)將靜態(tài)分析集成到內(nèi)部開(kāi)發(fā)循環(huán)中,用戶(hù)可以最大化他們從此類(lèi)工具中獲得的價(jià)值。
當(dāng)與精心設(shè)計(jì)的開(kāi)發(fā)過(guò)程結(jié)合使用時(shí),靜態(tài)分析工具可以提供對(duì)軟件狀態(tài)的關(guān)鍵可見(jiàn)性。這使開(kāi)發(fā)團(tuán)隊(duì)能夠了解其代碼中的風(fēng)險(xiǎn)級(jí)別以及風(fēng)險(xiǎn)所在的位置,以便他們可以采取行動(dòng)來(lái)減輕或完全消除它(表 1)。單個(gè)工具通常專(zhuān)注于軟件開(kāi)發(fā)團(tuán)隊(duì)面臨的特定問(wèn)題,團(tuán)隊(duì)經(jīng)常使用這些工具的組合來(lái)全面了解他們的開(kāi)發(fā)工作。
表 1:靜態(tài)分析工具通常會(huì)發(fā)現(xiàn)特定類(lèi)型的問(wèn)題,每種類(lèi)型代表不同類(lèi)型的風(fēng)險(xiǎn)并需要不同類(lèi)型的操作。
開(kāi)發(fā)人員傳統(tǒng)上通過(guò)簡(jiǎn)單的 IDE 集成或作為獨(dú)立工具使用靜態(tài)分析工具。雖然這些工具為開(kāi)發(fā)工作增加了重要價(jià)值,但隨著開(kāi)發(fā)人員花費(fèi)越來(lái)越多的時(shí)間使用和維護(hù)不同的工具以及篩選越來(lái)越多的結(jié)果,工具的激增也帶來(lái)了效率問(wèn)題。為了明智地管理開(kāi)發(fā)資源,團(tuán)隊(duì)必須能夠有效地管理、過(guò)濾和優(yōu)先考慮所有這些問(wèn)題。
為了解決這些問(wèn)題,開(kāi)發(fā)測(cè)試平臺(tái)應(yīng)運(yùn)而生,以便在一個(gè)地方統(tǒng)一和管理所有這些靜態(tài)分析信息,從而簡(jiǎn)化用戶(hù)體驗(yàn)并在更大范圍內(nèi)提高可見(jiàn)性和效率,同時(shí)提供相關(guān)的訪(fǎng)問(wèn)控制和報(bào)告。開(kāi)發(fā)測(cè)試平臺(tái)甚至開(kāi)始通過(guò)在靜態(tài)分析過(guò)程中利用早期程序運(yùn)行期間生成的工件來(lái)模糊靜態(tài)分析和其他類(lèi)型分析之間的界限。例如,這些平臺(tái)可以在靜態(tài)分析期間使用來(lái)自測(cè)試運(yùn)行的代碼覆蓋率信息來(lái)有效地自動(dòng)識(shí)別缺失的測(cè)試用例。解決這個(gè)問(wèn)題的傳統(tǒng)方法需要基于簡(jiǎn)單的覆蓋閾值的大量手動(dòng)工作。通過(guò)利用不同來(lái)源的數(shù)據(jù),
為 Java 選擇靜態(tài)分析工具
Java 最流行的免費(fèi)靜態(tài)分析工具可能是 Checkstyle、PMD 和 FindBugs。雖然它們都屬于“靜態(tài)分析”的范疇,但它們的優(yōu)勢(shì)是如此不同,以至于許多人認(rèn)為這些工具是互補(bǔ)的,而不是替代品。
格紋風(fēng)格
Checkstyle 被稱(chēng)為“一種開(kāi)發(fā)工具,可幫助程序員編寫(xiě)符合編碼標(biāo)準(zhǔn)的 Java 代碼 [1]”,盡管它并不嚴(yán)格限制自己執(zhí)行編碼標(biāo)準(zhǔn)。它為用戶(hù)提供了一個(gè)文檔化的 API 來(lái)定義他們自己的自定義檢查。典型的編碼標(biāo)準(zhǔn)利用基本規(guī)則使代碼更具可讀性,并減少未來(lái)代碼更改引入錯(cuò)誤的可能性。標(biāo)準(zhǔn)傾向于定義有關(guān)格式(空格、括號(hào)、命名、注釋等)、繼承和可見(jiàn)性的約定。如果得到充分執(zhí)行,設(shè)計(jì)良好的編碼標(biāo)準(zhǔn)可以幫助開(kāi)發(fā)人員降低風(fēng)險(xiǎn)。但是,執(zhí)行起來(lái)可能很困難,因?yàn)榫幋a標(biāo)準(zhǔn)會(huì)產(chǎn)生很多違規(guī)行為,并且可能存在忽略嘈雜規(guī)則的巨大壓力。使用遺留代碼,這會(huì)使執(zhí)行新的編碼標(biāo)準(zhǔn)變得不可行。雖然 Checkstyle 發(fā)現(xiàn)的大多數(shù)問(wèn)題不會(huì)影響代碼的正確性、健壯性或性能,但幫助開(kāi)發(fā)人員快速理解其他人編寫(xiě)的代碼具有真正的價(jià)值。如何量化這些違規(guī)所代表的風(fēng)險(xiǎn)并不總是顯而易見(jiàn)的,直接從違規(guī)計(jì)數(shù)衡量風(fēng)險(xiǎn)是有問(wèn)題的,但這些計(jì)數(shù)的變化可以作為風(fēng)險(xiǎn)變化的合理代理。
PMD
PMD 被描述為“……源代碼分析器。它會(huì)發(fā)現(xiàn)未使用的變量、空的 catch 塊、不必要的對(duì)象創(chuàng)建等等[2]。” 它也在不斷發(fā)展,目前的檢查主要集中在可能掩蓋開(kāi)發(fā)人員錯(cuò)誤的語(yǔ)法異常上,例如過(guò)于復(fù)雜的表達(dá)式、空塊、未使用的變量、參數(shù)和類(lèi)成員。它還有一個(gè)流行的模塊來(lái)識(shí)別重復(fù)的代碼。因?yàn)樗ǔ?bào)告“可疑代碼”而不是特定的編碼錯(cuò)誤或違反標(biāo)準(zhǔn)的情況,所以用戶(hù)需要仔細(xì)選擇為日常使用啟用的檢查。因?yàn)閺?qiáng)制規(guī)則是由用戶(hù)選擇的,所以這個(gè)工具對(duì)遺留項(xiàng)目和新建項(xiàng)目都很有用,而且通常很容易將這些計(jì)數(shù)與風(fēng)險(xiǎn)相關(guān)聯(lián)。很遺憾,
查找錯(cuò)誤
FindBugs 可能是這些工具中最受歡迎的。它查找代碼中的實(shí)際錯(cuò)誤,以及可疑代碼和標(biāo)準(zhǔn)違規(guī)。由于報(bào)告的問(wèn)題范圍廣泛,因此使用包含項(xiàng)目最相關(guān)檢查的配置非常重要。對(duì)于遺留項(xiàng)目尤其如此,因?yàn)閺囊婚_(kāi)始就更容易保持新項(xiàng)目的清潔。與 PMD 一樣,任何團(tuán)隊(duì)都可以從使用 FindBugs 中受益,并且將問(wèn)題計(jì)數(shù)與風(fēng)險(xiǎn)相關(guān)聯(lián)非常簡(jiǎn)單。
商業(yè)靜態(tài)分析工具顯示出類(lèi)似的多樣性,可以識(shí)別從標(biāo)準(zhǔn)違規(guī)到實(shí)際缺陷和安全漏洞的所有內(nèi)容。為了說(shuō)明商業(yè)工具與免費(fèi)工具的比較,我使用專(zhuān)有的靜態(tài)分析解決方案和 FindBugs 的 2.0.1 版分析了 Jenkins 作業(yè)管理系統(tǒng) (www.jenkins-ci.org) 的 1.496 版,啟用了所有檢查。 在此代碼庫(kù)中,識(shí)別出 852 個(gè)獨(dú)特問(wèn)題——兩種產(chǎn)品僅識(shí)別出 28 個(gè)問(wèn)題。該專(zhuān)有解決方案發(fā)現(xiàn)了 197 個(gè)獨(dú)特問(wèn)題,其中 188 個(gè)來(lái)自影響較大的類(lèi)別(安全和并發(fā)錯(cuò)誤、資源泄漏和未處理的異常,如 null 取消引用)。FindBugs 發(fā)現(xiàn)了 627 個(gè)獨(dú)特問(wèn)題,其中 29 個(gè)來(lái)自這些高影響類(lèi)別。簡(jiǎn)而言之,
開(kāi)發(fā)測(cè)試——將所有內(nèi)容捆綁在一起
靜態(tài)分析工具是 Java 開(kāi)發(fā)人員軟件開(kāi)發(fā)工作中的強(qiáng)大盟友,因?yàn)檫@些工具使開(kāi)發(fā)人員能夠深入了解整個(gè)軟件開(kāi)發(fā)生命周期的風(fēng)險(xiǎn)。它們通常很容易自動(dòng)化,使用戶(hù)能夠花時(shí)間解決問(wèn)題而不是運(yùn)行工具。
在管理風(fēng)險(xiǎn)方面,通常信息越多越好——只要這些信息能夠闡明開(kāi)發(fā)人員關(guān)心的實(shí)際風(fēng)險(xiǎn)來(lái)源。在決定采用哪些工具時(shí),請(qǐng)記住不僅要考慮分析工具識(shí)別的問(wèn)題類(lèi)型,還要考慮這些工具如何協(xié)同工作以提供額外價(jià)值。此外,請(qǐng)務(wù)必適當(dāng)?shù)嘏渲盟鼈儯悦鈫?wèn)題的數(shù)量使您的用戶(hù)不堪重負(fù)。
現(xiàn)代開(kāi)發(fā)測(cè)試平臺(tái)通過(guò)將數(shù)據(jù)統(tǒng)一在一個(gè)地方、簡(jiǎn)化用戶(hù)體驗(yàn)并創(chuàng)造機(jī)會(huì)來(lái)提供更多價(jià)值,從而將測(cè)試工具提升到另一個(gè)層次。
審核編輯:郭婷
-
JAVA
+關(guān)注
關(guān)注
19文章
2970瀏覽量
104810 -
源代碼
+關(guān)注
關(guān)注
96文章
2945瀏覽量
66774
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論