發(fā)布日期:2022-07-14 點擊率:52
工具已經(jīng)從簡單的語法檢查器發(fā)展成強(qiáng)大的工具,可以用來發(fā)現(xiàn)在大規(guī)模代碼庫的復(fù)雜交互中所產(chǎn)生的缺陷。直到最近,它們?nèi)员毁|(zhì)量保證人員用來在接近項目完成的綜合創(chuàng)建期間評估代碼。
最新發(fā)布的產(chǎn)品正在將這些工具的作用向開發(fā)流程的早期階段推進(jìn),以便幫助開發(fā)者在軟件錯誤蔓延前的更早期將其檢測出來。Klocwork公司的Insight和GrammaTech公司的CodeSonar Enterprise都能滿足開發(fā)人員的需要,即使在許多代碼段還缺失的情況下也能發(fā)揮作用。
軟件開發(fā)人員通常采用兩種工具來自動檢測他們代碼中的錯誤。一種是動態(tài)分析工具,可以在代碼執(zhí)行過程中查看代碼;另一種是靜態(tài)分析工具,通過算法檢查代碼的錯誤。這兩種工具各有優(yōu)缺點。
動態(tài)分析擅長于發(fā)現(xiàn)運(yùn)行時錯誤,如資源泄漏和動態(tài)存儲訛誤。開發(fā)人員可信賴動態(tài)分析工具所報告的任何錯誤都是真實的,因為這些錯誤是在實際代碼執(zhí)行期間被發(fā)現(xiàn)的。
但為了高效地使用動態(tài)分析,代碼必須被全面執(zhí)行,因此需要使用測試案例。這樣,動態(tài)分析工具在尋找錯誤方面的效率就取決于測試案例的質(zhì)量。另外,由于動態(tài)分析工具是與運(yùn)行軟件一起工作的,因此只能在開發(fā)過程的晚期階段起作用,此時代碼已經(jīng)完全編好并首次被整合。
靜態(tài)分析工具使用算法技術(shù)檢查源代碼中的錯誤,并標(biāo)明問題區(qū)域,以便編程人員做更詳細(xì)的檢查。這種算法方式無需使用測試案例,算法本身決定了分析工具發(fā)現(xiàn)錯誤的效率。不過,這種方法存在識別失誤的可能性:有可能標(biāo)記為錯誤的代碼事實上是可以正確執(zhí)行的。如果它們產(chǎn)生太多的錯誤時別,用工具供應(yīng)商術(shù)語而言就是低“準(zhǔn)確性”,靜態(tài)工具就會影響用戶開展后續(xù)工作,并有可能掩蓋真正的錯誤。
這兩種工具呈互補(bǔ)的關(guān)系,各自都擅長于發(fā)現(xiàn)對方很難發(fā)現(xiàn)的錯誤,但動態(tài)分析工具似乎在開發(fā)人員中更加普及。部分原因是早期的靜態(tài)分析工具更像是開發(fā)人員用來尋找相對簡單的編碼和格式錯誤的語法檢查器。
然而在過去十幾年中,隨著研究人員開發(fā)出更加高效的算法,靜態(tài)分析工具變得越來越強(qiáng)大。它們已經(jīng)能夠識別出大量的微小錯誤(見表1),其中有許多錯誤只在搶先多任務(wù)環(huán)境中的任務(wù)交織期間表現(xiàn)為執(zhí)行問題。
表1:可被靜態(tài)源代碼分析工具發(fā)現(xiàn)的典型錯誤。
上述新的靜態(tài)分析工具額外的好處之一是:它們擁有增強(qiáng)的能力,可以發(fā)現(xiàn)代碼中有可能被惡意用戶用來突破安全防護(hù)的缺陷。開發(fā)人員很容易低估軟件安全缺陷,因為他們只是指望代碼能正常執(zhí)行。靜態(tài)分析工具的算法沒有預(yù)期性,只是一種規(guī)程,因此會不帶偏見地識別潛在的問題。
向開發(fā)早期推進(jìn)
直到最近,靜態(tài)源代碼分析工具還只是用于開發(fā)過程的晚期,即開發(fā)人員能夠完整訪問所有代碼段的綜合構(gòu)建階段。然而許多新推出的工具,包括Klocwork公司的Insight和GrammaTech公司的CodeSonar Enterprise,都已經(jīng)通過性能的增強(qiáng)使得開發(fā)者在代碼編寫的過程中使用這種靜態(tài)分析工具。
這種新一代靜態(tài)源代碼分析工具利用企業(yè)級軟件開發(fā)環(huán)境,整合了從事同一項目不同部分的開發(fā)團(tuán)隊的成果(見圖1)。通過實現(xiàn)代碼段分析掃描方面信息的對等交換,這種工具可以收集到精確檢測錯誤所需的范圍更廣的語境。
圖1:新的靜態(tài)源代碼分析工具可以通過收集中心數(shù)據(jù)庫中個別代碼段的數(shù)據(jù)、建立系統(tǒng)性觀點來最大化效率。
這種更廣范圍的語境,再加上為遺失的代碼自動建模,就可以幫助開發(fā)人員快速建立有效可靠的代碼檢查基礎(chǔ),即使當(dāng)時項目還沒有全部完成。在這個階段捕捉到的錯誤比開發(fā)過程晚期的錯誤更容易修正,代價也較低。另外,較早捕捉錯誤可以防止這些錯誤在系統(tǒng)中擴(kuò)散進(jìn)而影響后期開發(fā)的代碼行為。
然而,在早期使用這種靜態(tài)分析有個前提,即充分理解局部查看代碼所引起的局限性。“重要的是記住在軟件開發(fā)的早期階段,工具是不夠精確的,并可能忽略了程序間的影響。”GrammaTech公司工程副總裁Paul Anderson提醒道。
但Anderson補(bǔ)充道,隨著被分析代碼規(guī)模的增長,結(jié)果將有所改善。經(jīng)常較早地使用靜態(tài)分析工具,還有助于培養(yǎng)開發(fā)人員發(fā)現(xiàn)他們個人編碼風(fēng)格的缺點,并改變他們的編程方式以便防止重復(fù)發(fā)生相同類型的錯誤。
由于這種新一代工具被整個項目開發(fā)團(tuán)隊所使用,他們可以記錄分析結(jié)果的變化規(guī)律,從而幫助識別新的問題。例如Klocwork公司的Insight可以保存每次分析過程產(chǎn)生的數(shù)據(jù),從而讓開發(fā)人員在整個開發(fā)過程中跟蹤標(biāo)示出的錯誤,該公司首席技術(shù)官Gwyn Fisher表示。
該工具還允許授權(quán)的高級開發(fā)人員將錯誤標(biāo)示為偽錯誤或不相關(guān)錯誤,Fisher補(bǔ)充道,這樣,在隨后的分析操作中就不會再報告它們。這將有助于開發(fā)人員集中精力處理真正的錯誤,并使任何新引入的錯誤更加明顯,或者在交互代碼部分被一起分析時發(fā)生的錯誤更加突出。
何時采用靜態(tài)工具?
在開發(fā)過程中要多么早和多么頻繁地使用靜態(tài)代碼分析工具?這取決于具體的項目情況。“不同團(tuán)隊可以接受不同等級的偽錯誤。”GrammaTech公司的Anderson表示,“安全性非常關(guān)鍵的項目可能容忍10:1的假:真錯誤報告率,而其它項目50:50的比率就有問題,因為跟蹤偽錯誤非常浪費(fèi)時間。”
Klocwork公司的Fisher指出,“有些用戶可能從第一天就開始使用分析工具,此時工具的作用表現(xiàn)的相對較弱,他們能夠容忍過多的偽錯誤。其它用戶則寧愿等待架構(gòu)全部開發(fā)好再使用工具,即使那時缺陷密度會比較高。”
最后,項目組必須自己決定如何平衡在開發(fā)過程早期發(fā)現(xiàn)偽錯誤的成本和在開發(fā)過程晚期發(fā)現(xiàn)和修正錯誤的成本之間的關(guān)系。但無論如何要選用靜態(tài)分析工具,因為這些工具已被事實證明在發(fā)現(xiàn)代碼缺陷和安全弱點方面具有極高的價值。既然這些工具已經(jīng)交付到開發(fā)人員手中,缺陷可以被盡早發(fā)現(xiàn),那么靜態(tài)源代碼分析工具也將有助于降低開發(fā)成本。
作者:Richard A. Quinnell 特約技術(shù)編輯