原創(chuàng)|使用教程|編輯:鄭恭琳|2020-06-11 14:58:58.110|閱讀 418 次
概述:這篇文章是我撰寫的關(guān)于靜態(tài)分析入門的第一篇文章,旨在幫助新用戶在其開發(fā)過程中采用靜態(tài)分析工具。如果您起初沒有花時(shí)間來確保已確定適合項(xiàng)目的正確策略,那么上手入門可能會(huì)很棘手。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
這篇文章是我撰寫的關(guān)于靜態(tài)分析入門的第一篇文章,旨在幫助新用戶在其開發(fā)過程中采用靜態(tài)分析工具。如果您起初沒有花時(shí)間來確保已確定適合項(xiàng)目的正確策略,那么上手入門可能會(huì)很棘手。
作為Parasoft的解決方案架構(gòu)師,我們吸引了很多人在這一領(lǐng)域?qū)で髱椭灾滥⒉还聠危∪绻肓私飧?信息,可以下載并閱讀我?guī)椭帉懙耐暾改稀?
我假設(shè)您已安裝了靜態(tài)分析工具,并且已設(shè)置任何初始配置。此后,如果您起初沒有花時(shí)間來確保已確定適合項(xiàng)目的正確策略,那么上手可能會(huì)很棘手。在這里,“入門”的意思是更好地理解將靜態(tài)分析集成到現(xiàn)有項(xiàng)目中的一般方法,以及如何隨著時(shí)間的推移增加靜態(tài)分析的投資回報(bào)率。
簡單來說,靜態(tài)分析是檢查源代碼和二進(jìn)制代碼而無需執(zhí)行的過程,通常是為了查找錯(cuò)誤或評估質(zhì)量。與需要運(yùn)行程序才能運(yùn)行的動(dòng)態(tài)分析(例如Parasoft Insure++)不同,靜態(tài)分析可以在源代碼上運(yùn)行,而無需可執(zhí)行文件。
這意味著可以對部分完整的代碼、庫和第三方源代碼使用靜態(tài)分析。開發(fā)人員可以使用靜態(tài)分析,也可以在編寫或修改代碼時(shí)使用靜態(tài)分析,也可以在任何任意代碼基礎(chǔ)上應(yīng)用靜態(tài)分析。
支持安全性的靜態(tài)分析
在應(yīng)用程序安全域中,靜態(tài)代碼分析用術(shù)語“靜態(tài)應(yīng)用程序安全性測試(SAST)”進(jìn)行。靜態(tài)分析可以支持安全漏洞檢測以及錯(cuò)誤檢測、質(zhì)量指標(biāo)和編碼標(biāo)準(zhǔn)一致性。
支持功能安全和編碼標(biāo)準(zhǔn)的靜態(tài)分析
諸如ISO 26262或EN 50128之類的功能安全標(biāo)準(zhǔn)還要求(或者在某些情況下,“強(qiáng)烈推薦”)靜態(tài)分析工具,因?yàn)樗鼈兡軌驒z測出難以發(fā)現(xiàn)的缺陷并提高軟件的安全性。當(dāng)然,這還涉及到安全性,因?yàn)殪o態(tài)分析工具還可以幫助軟件團(tuán)隊(duì)符合主要用于驗(yàn)證安全編碼的編碼標(biāo)準(zhǔn),例如CERT甚至是MISRA。
靜態(tài)分析工具的一大優(yōu)點(diǎn)是,可以在項(xiàng)目的任何階段引入和使用它們,即使項(xiàng)目不完整且未部分編碼,該工具仍然有效。引入靜態(tài)分析的最大挑戰(zhàn)是大量代碼會(huì)產(chǎn)生大量警告。因此,將靜態(tài)分析集成到項(xiàng)目中時(shí),重點(diǎn)應(yīng)放在使團(tuán)隊(duì)盡快變得高效上,并最大程度地減少團(tuán)隊(duì)被所有靜態(tài)分析警告淹沒的機(jī)會(huì)。這并不是要降低這些警告的重要性,但是大多數(shù)開發(fā)人員沒有(至少不是立即)修復(fù)現(xiàn)有或遺留代碼的奢侈手段。
重點(diǎn)應(yīng)該是將工具集成到日常流程中,以便最大程度地訪問和使用,然后處理最關(guān)鍵的錯(cuò)誤和安全漏洞。一旦團(tuán)隊(duì)變得更加熟練,您就可以專注于優(yōu)化工具和流程以提高投資回報(bào)率。
為了充分利用靜態(tài)分析,了解最終目標(biāo)非常重要。例如,如果目標(biāo)是更高的安全性,這將影響分析和補(bǔ)救的重點(diǎn),或者目標(biāo)是符合諸如MISRA C之類的編碼標(biāo)準(zhǔn),那么重點(diǎn)將成為滿足編碼標(biāo)準(zhǔn)并根據(jù)需要向認(rèn)證實(shí)體證明。
初次采用靜態(tài)分析時(shí),很容易陷入陷阱,那就是越好越好(即,更多的分析和更多的警告意味著您將從工具中獲得最大的價(jià)值)。這是一個(gè)常見的陷阱。相反,要專注于最終目標(biāo)。
如果以安全為重點(diǎn),則應(yīng)將重點(diǎn)放在提高安全性上,并減少對其他類型警告的干擾。當(dāng)然,關(guān)鍵的bug總是很重要,要找到它們,但是它們不應(yīng)該偏離主要目標(biāo)。隨著時(shí)間的推移,隨著團(tuán)隊(duì)的精通,您將能夠納入其他次要目標(biāo),例如提高整體質(zhì)量或執(zhí)行編碼標(biāo)準(zhǔn)。隨著靜態(tài)分析成為每個(gè)開發(fā)人員日常工作的一部分,他們將能夠更快地分析結(jié)果并更有效地修復(fù)錯(cuò)誤。此時(shí),次要目標(biāo)將更有效地實(shí)現(xiàn),而不是簡單地被壓倒。
一旦了解了要關(guān)注的主要目標(biāo),就需要確定開發(fā)中產(chǎn)品的成熟度,因?yàn)樗鼤?huì)影響采用靜態(tài)分析的方式。考慮下面的主要開發(fā)階段,并確定項(xiàng)目適合的位置,以便您了解哪種采用方法最適合您。
現(xiàn)有項(xiàng)目——當(dāng)前開發(fā)中
最常見的情況是決定使用靜態(tài)分析并將其推廣到其當(dāng)前項(xiàng)目的軟件組織。
每個(gè)項(xiàng)目都可以選擇在沖刺開始時(shí)或在重大新功能更新開始時(shí)采用這些工具。實(shí)際上,軟件團(tuán)隊(duì)一直在工作——即使一個(gè)產(chǎn)品“完成”,另一個(gè)版本或變體也在開發(fā)中。這種采用方案的關(guān)鍵方面是每天都有大量的現(xiàn)有代碼和新代碼正在開發(fā)。推薦的集成方法被稱為“行之有效”的方法,這意味著在開發(fā)新代碼時(shí)會(huì)對其進(jìn)行改進(jìn),同時(shí)將不太重要的警告延遲為技術(shù)債務(wù)。我們稍后再討論。
現(xiàn)有項(xiàng)目——維護(hù)市場上的產(chǎn)品
對成熟的產(chǎn)品采用靜態(tài)分析可能會(huì)與仍在開發(fā)的項(xiàng)目有不同的目標(biāo)。這是一種產(chǎn)品,處于軟件開發(fā)生命周期的較早階段,僅編寫很少的新代碼即可解決遺留的錯(cuò)誤和安全漏洞。對這些項(xiàng)目采用靜態(tài)分析的主要方法稱為“確認(rèn)并推遲”。用這種方法,由于很少開發(fā)新代碼,因此將所有發(fā)現(xiàn)的錯(cuò)誤和安全漏洞添加到現(xiàn)有技術(shù)債務(wù)中。
未開發(fā)項(xiàng)目
盡管軟件團(tuán)隊(duì)通常不會(huì)有一個(gè)嶄新的起點(diǎn),但是新產(chǎn)品和項(xiàng)目是將新工具和技術(shù)集成到開發(fā)過程中的理想點(diǎn)。
在這些項(xiàng)目中,幾乎沒有特定于該項(xiàng)目的現(xiàn)有代碼,但它仍可能依賴于第三方和開源軟件。開發(fā)人員可以從一開始就將靜態(tài)分析集成到他們的開發(fā)環(huán)境中,以確保在編寫代碼時(shí)獲得高質(zhì)量的標(biāo)準(zhǔn)。這允許采用編碼標(biāo)準(zhǔn),并確保在出現(xiàn)嚴(yán)重的靜態(tài)分析警告時(shí)對其進(jìn)行處理,從而為技術(shù)債務(wù)增加了更少的錯(cuò)誤和漏洞。在這種情況下,采用的方法恰當(dāng)?shù)胤Q為“未開發(fā)的地區(qū)”。
在將靜態(tài)分析工具安裝到項(xiàng)目中之后,通常會(huì)有相當(dāng)長的關(guān)于該工具報(bào)告的違規(guī)和警告的報(bào)告。這可能是不堪重負(fù)的,尤其是在大型代碼庫中,因此,如何管理這些初始報(bào)告直接影響將工具集成到項(xiàng)目中的成功。
并非所有警告都至關(guān)重要,因此不需要立即處理所有問題。學(xué)習(xí)立即解決什么和推遲解決什么是成功的關(guān)鍵。如上所述,產(chǎn)品的成熟度和尺寸對方法有直接影響,下文將對此進(jìn)行詳細(xì)概述。
排沙法
顧名思義,通過這種方法,開發(fā)人員決定在進(jìn)行初步分析后,他們不會(huì)再將任何嚴(yán)重的警告和違規(guī)行為輸入代碼庫。換句話說,他們承諾分析每個(gè)嚴(yán)重警告,以決定其準(zhǔn)確性,并在錯(cuò)誤確實(shí)存在時(shí)及時(shí)實(shí)施修復(fù)。
團(tuán)隊(duì)還可以決定添加在現(xiàn)有代碼中已經(jīng)發(fā)現(xiàn)的嚴(yán)重警告,以將其添加到其報(bào)告工具中的錯(cuò)誤列表中。這些類型的警告的示例可能是嚴(yán)重的安全漏洞(例如SQL注入)或嚴(yán)重的內(nèi)存錯(cuò)誤(例如緩沖區(qū)溢出)。在大多數(shù)情況下,不太嚴(yán)重的警告可以推遲到以后進(jìn)行分析。您可能會(huì)想,“這不只是增加了我們的技術(shù)債務(wù)嗎?”如果是,那是對的!但是在這個(gè)階段,我們可以接受。這些警告中的任何潛在錯(cuò)誤已在技術(shù)債務(wù)堆中。至少現(xiàn)在,它們已被識(shí)別,以后更容易修復(fù)。
確認(rèn)和延遲法
如果產(chǎn)品已經(jīng)投放市場并且正在維護(hù)中,則識(shí)別代碼中任何遺留的錯(cuò)誤和安全漏洞仍然是有益的,但是對于開發(fā)人員來說,分析(更不用說修復(fù))所有這些警告是不可行的。
在這種情況下,查看最重要的報(bào)告并決定采取的措施是有意義的。其余警告被確認(rèn),因?yàn)檐浖F(tuán)隊(duì)認(rèn)識(shí)到它們的存在,但是大多數(shù)情況下將它們推遲到以后。 (這再次增加了組織的技術(shù)負(fù)擔(dān),但是如上所述,這些錯(cuò)誤在技術(shù)上已經(jīng)以技術(shù)負(fù)擔(dān)的形式存在。)此方法與“一線原則”方法的不同之處在于,在確定關(guān)鍵警告之后,您只需推遲其余的,無需任何分析。
新建項(xiàng)目法
現(xiàn)有代碼很少的項(xiàng)目是進(jìn)行靜態(tài)分析的理想起點(diǎn)。在這種情況下,軟件團(tuán)隊(duì)可以調(diào)查所有出現(xiàn)的警告并修復(fù)發(fā)現(xiàn)的錯(cuò)誤。與其他方法不同,只有很少的警告需要管理,因此開發(fā)人員可以處理額外的工作量。這也是通過工具實(shí)施和實(shí)施編碼標(biāo)準(zhǔn)的理想時(shí)機(jī),因?yàn)榭梢栽?/span>IDE中以及在將任何代碼提交給版本控制之前(在這里描述的其他情況下也可以這樣做)識(shí)別和修復(fù)違規(guī)情況。 。
靜態(tài)分析在成熟度的三個(gè)主要階段中的采用方式通過處理警告積壓的方式有所不同,如下所示:
在三個(gè)主要的成熟階段采用靜態(tài)分析:在一個(gè)新建項(xiàng)目中,大多數(shù)報(bào)告的警告都得到了調(diào)查和修復(fù),而很少涉及技術(shù)債務(wù)。正在開發(fā)的項(xiàng)目往往積壓了大部分待處理的警告,而只處理關(guān)鍵警告,而維護(hù)中的產(chǎn)品往往會(huì)推遲大多數(shù)警告。
開源或輕量級(jí)靜態(tài)分析工具與商業(yè)高級(jí)靜態(tài)分析工具之間的主要區(qū)別之一是能夠配置啟用了哪些檢查程序集進(jìn)行分析,以及根據(jù)警告類別、文件名、嚴(yán)重性和其他屬性過濾出報(bào)告的結(jié)果。這有助于實(shí)現(xiàn)不被淹沒的目標(biāo)——開發(fā)人員可以僅關(guān)注他們感興趣的警告類型,并減少在任何給定時(shí)間提供的信息量。
在配置檢查器和過濾結(jié)果之間也需要注意一個(gè)差異。盡管最初似乎最好限制全局配置中的規(guī)則數(shù)量,但是應(yīng)該經(jīng)常使用過濾來限制報(bào)告的范圍,而不是完全消除檢查程序。如果在配置中關(guān)閉了后來證明很重要的規(guī)則,則警告存儲(chǔ)庫中將沒有歷史記錄,因此您將無法找出錯(cuò)誤是由于最近的更改引起的還是代碼中已經(jīng)存在的在采用靜態(tài)分析之前。
我建議使用配置將規(guī)則集僅限制為可預(yù)見的對軟件團(tuán)隊(duì)有用的規(guī)則。同樣,從最終目標(biāo)開始:如果提高安全性是關(guān)鍵目標(biāo),那么啟用所有與安全性相關(guān)的規(guī)則,禁用次要的規(guī)則并啟用諸如CERT C之類的內(nèi)置安全編碼標(biāo)準(zhǔn)是有意義的。然后,如果您使用的是諸如Parasoft C/C++test之類的高級(jí)靜態(tài)分析解決方案,則可以利用其內(nèi)置的管理工具來處理從靜態(tài)分析報(bào)告生成的數(shù)據(jù),并推動(dòng)未來的發(fā)展重點(diǎn)。
靜態(tài)分析工具使軟件組織無需執(zhí)行代碼即可檢測和跟蹤錯(cuò)誤的安全漏洞。這些工具可以應(yīng)用于現(xiàn)有的、遺留的和第三方代碼并提供質(zhì)量。
靜態(tài)分析的采用在一定程度上根據(jù)項(xiàng)目的成熟度而有所不同。大量的代碼確實(shí)會(huì)導(dǎo)致大量警告。這是完全可管理的,能否成功采用取決于團(tuán)隊(duì)決定如何處理結(jié)果。針對項(xiàng)目的每個(gè)主要成熟度級(jí)別引入了各種技術(shù),以及如何將這些工具集成到開發(fā)人員、團(tuán)隊(duì)負(fù)責(zé)人和經(jīng)理的日常工作流程中。
在我的下一篇文章中,我將討論將靜態(tài)分析集成到您的日常工作流程中,請繼續(xù)關(guān)注!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn