• <menu id="w2i4a"></menu>
  • logo Parasoft C/C++test 使用教程

    文檔首頁>>Parasoft C/C++test 使用教程>>不會使團隊不知所措的靜態(tài)分析入門方法

    不會使團隊不知所措的靜態(tài)分析入門方法


    這篇文章是我撰寫的關(guān)于靜態(tài)分析入門的第一篇文章,旨在幫助新用戶在其開發(fā)過程中采用靜態(tài)分析工具。如果您起初沒有花時間來確保已確定適合項目的正確策略,那么上手入門可能會很棘手。

    作為Parasoft的解決方案架構(gòu)師,我們吸引了很多人在這一領(lǐng)域?qū)で髱椭?,所以知道您并不孤單!如果您想了解更多信息,可以下載并閱讀我?guī)椭帉懙耐暾改稀?

    我假設(shè)您已安裝了靜態(tài)分析工具,并且已設(shè)置任何初始配置。此后,如果您起初沒有花時間來確保已確定適合項目的正確策略,那么上手可能會很棘手。在這里,“入門”的意思是更好地理解將靜態(tài)分析集成到現(xiàn)有項目中的一般方法,以及如何隨著時間的推移增加靜態(tài)分析的投資回報率。


    什么是靜態(tài)分析?


    簡單來說,靜態(tài)分析是檢查源代碼和二進制代碼而無需執(zhí)行的過程,通常是為了查找錯誤或評估質(zhì)量。與需要運行程序才能運行的動態(tài)分析(例如Parasoft Insure++)不同,靜態(tài)分析可以在源代碼上運行,而無需可執(zhí)行文件。


    這意味著可以對部分完整的代碼、庫和第三方源代碼使用靜態(tài)分析。開發(fā)人員可以使用靜態(tài)分析,也可以在編寫或修改代碼時使用靜態(tài)分析,也可以在任何任意代碼基礎(chǔ)上應(yīng)用靜態(tài)分析。

    支持安全性的靜態(tài)分析

    在應(yīng)用程序安全域中,靜態(tài)代碼分析用術(shù)語“靜態(tài)應(yīng)用程序安全性測試(SAST)”進行。靜態(tài)分析可以支持安全漏洞檢測以及錯誤檢測、質(zhì)量指標(biāo)和編碼標(biāo)準(zhǔn)一致性。

    支持功能安全和編碼標(biāo)準(zhǔn)的靜態(tài)分析

    諸如ISO 26262或EN 50128之類的功能安全標(biāo)準(zhǔn)還要求(或者在某些情況下,“強烈推薦”)靜態(tài)分析工具,因為它們能夠檢測出難以發(fā)現(xiàn)的缺陷并提高軟件的安全性。當(dāng)然,這還涉及到安全性,因為靜態(tài)分析工具還可以幫助軟件團隊符合主要用于驗證安全編碼的編碼標(biāo)準(zhǔn),例如CERT甚至是MISRA。


    將靜態(tài)分析引入您的項目


    靜態(tài)分析工具的一大優(yōu)點是,可以在項目的任何階段引入和使用它們,即使項目不完整且未部分編碼,該工具仍然有效。引入靜態(tài)分析的最大挑戰(zhàn)是大量代碼會產(chǎn)生大量警告。因此,將靜態(tài)分析集成到項目中時,重點應(yīng)放在使團隊盡快變得高效上,并最大程度地減少團隊被所有靜態(tài)分析警告淹沒的機會。這并不是要降低這些警告的重要性,但是大多數(shù)開發(fā)人員沒有(至少不是立即)修復(fù)現(xiàn)有或遺留代碼的奢侈手段。

    重點應(yīng)該是將工具集成到日常流程中,以便最大程度地訪問和使用,然后處理最關(guān)鍵的錯誤和安全漏洞。一旦團隊變得更加熟練,您就可以專注于優(yōu)化工具和流程以提高投資回報率。


    以終為始


    為了充分利用靜態(tài)分析,了解最終目標(biāo)非常重要。例如,如果目標(biāo)是更高的安全性,這將影響分析和補救的重點,或者目標(biāo)是符合諸如MISRA C之類的編碼標(biāo)準(zhǔn),那么重點將成為滿足編碼標(biāo)準(zhǔn)并根據(jù)需要向認證實體證明。

    初次采用靜態(tài)分析時,很容易陷入陷阱,那就是越好越好(即,更多的分析和更多的警告意味著您將從工具中獲得最大的價值)。這是一個常見的陷阱。相反,要專注于最終目標(biāo)。

    如果以安全為重點,則應(yīng)將重點放在提高安全性上,并減少對其他類型警告的干擾。當(dāng)然,關(guān)鍵的bug總是很重要,要找到它們,但是它們不應(yīng)該偏離主要目標(biāo)。隨著時間的推移,隨著團隊的精通,您將能夠納入其他次要目標(biāo),例如提高整體質(zhì)量或執(zhí)行編碼標(biāo)準(zhǔn)。隨著靜態(tài)分析成為每個開發(fā)人員日常工作的一部分,他們將能夠更快地分析結(jié)果并更有效地修復(fù)錯誤。此時,次要目標(biāo)將更有效地實現(xiàn),而不是簡單地被壓倒。


    在產(chǎn)品成熟度的每個階段引入靜態(tài)分析的策略


    一旦了解了要關(guān)注的主要目標(biāo),就需要確定開發(fā)中產(chǎn)品的成熟度,因為它會影響采用靜態(tài)分析的方式??紤]下面的主要開發(fā)階段,并確定項目適合的位置,以便您了解哪種采用方法最適合您。

    現(xiàn)有項目——當(dāng)前開發(fā)中

    最常見的情況是決定使用靜態(tài)分析并將其推廣到其當(dāng)前項目的軟件組織。

    每個項目都可以選擇在沖刺開始時或在重大新功能更新開始時采用這些工具。實際上,軟件團隊一直在工作——即使一個產(chǎn)品“完成”,另一個版本或變體也在開發(fā)中。這種采用方案的關(guān)鍵方面是每天都有大量的現(xiàn)有代碼和新代碼正在開發(fā)。推薦的集成方法被稱為“行之有效”的方法,這意味著在開發(fā)新代碼時會對其進行改進,同時將不太重要的警告延遲為技術(shù)債務(wù)。我們稍后再討論。

    現(xiàn)有項目——維護市場上的產(chǎn)品

    對成熟的產(chǎn)品采用靜態(tài)分析可能會與仍在開發(fā)的項目有不同的目標(biāo)。這是一種產(chǎn)品,處于軟件開發(fā)生命周期的較早階段,僅編寫很少的新代碼即可解決遺留的錯誤和安全漏洞。對這些項目采用靜態(tài)分析的主要方法稱為“確認并推遲”。用這種方法,由于很少開發(fā)新代碼,因此將所有發(fā)現(xiàn)的錯誤和安全漏洞添加到現(xiàn)有技術(shù)債務(wù)中。

    未開發(fā)項目

    盡管軟件團隊通常不會有一個嶄新的起點,但是新產(chǎn)品和項目是將新工具和技術(shù)集成到開發(fā)過程中的理想點。

    在這些項目中,幾乎沒有特定于該項目的現(xiàn)有代碼,但它仍可能依賴于第三方和開源軟件。開發(fā)人員可以從一開始就將靜態(tài)分析集成到他們的開發(fā)環(huán)境中,以確保在編寫代碼時獲得高質(zhì)量的標(biāo)準(zhǔn)。這允許采用編碼標(biāo)準(zhǔn),并確保在出現(xiàn)嚴(yán)重的靜態(tài)分析警告時對其進行處理,從而為技術(shù)債務(wù)增加了更少的錯誤和漏洞。在這種情況下,采用的方法恰當(dāng)?shù)胤Q為“未開發(fā)的地區(qū)”。


    靜態(tài)分析采用方法:如何管理早期的靜態(tài)分析報告


    在將靜態(tài)分析工具安裝到項目中之后,通常會有相當(dāng)長的關(guān)于該工具報告的違規(guī)和警告的報告。這可能是不堪重負的,尤其是在大型代碼庫中,因此,如何管理這些初始報告直接影響將工具集成到項目中的成功。

    并非所有警告都至關(guān)重要,因此不需要立即處理所有問題。學(xué)習(xí)立即解決什么和推遲解決什么是成功的關(guān)鍵。如上所述,產(chǎn)品的成熟度和尺寸對方法有直接影響,下文將對此進行詳細概述。

    排沙法

    顧名思義,通過這種方法,開發(fā)人員決定在進行初步分析后,他們不會再將任何嚴(yán)重的警告和違規(guī)行為輸入代碼庫。換句話說,他們承諾分析每個嚴(yán)重警告,以決定其準(zhǔn)確性,并在錯誤確實存在時及時實施修復(fù)。

    團隊還可以決定添加在現(xiàn)有代碼中已經(jīng)發(fā)現(xiàn)的嚴(yán)重警告,以將其添加到其報告工具中的錯誤列表中。這些類型的警告的示例可能是嚴(yán)重的安全漏洞(例如SQL注入)或嚴(yán)重的內(nèi)存錯誤(例如緩沖區(qū)溢出)。在大多數(shù)情況下,不太嚴(yán)重的警告可以推遲到以后進行分析。您可能會想,“這不只是增加了我們的技術(shù)債務(wù)嗎?”如果是,那是對的!但是在這個階段,我們可以接受。這些警告中的任何潛在錯誤已在技術(shù)債務(wù)堆中。至少現(xiàn)在,它們已被識別,以后更容易修復(fù)。

    確認和延遲法

    如果產(chǎn)品已經(jīng)投放市場并且正在維護中,則識別代碼中任何遺留的錯誤和安全漏洞仍然是有益的,但是對于開發(fā)人員來說,分析(更不用說修復(fù))所有這些警告是不可行的。

    在這種情況下,查看最重要的報告并決定采取的措施是有意義的。其余警告被確認,因為軟件團隊認識到它們的存在,但是大多數(shù)情況下將它們推遲到以后。 (這再次增加了組織的技術(shù)負擔(dān),但是如上所述,這些錯誤在技術(shù)上已經(jīng)以技術(shù)負擔(dān)的形式存在。)此方法與“一線原則”方法的不同之處在于,在確定關(guān)鍵警告之后,您只需推遲其余的,無需任何分析。

    新建項目法

    現(xiàn)有代碼很少的項目是進行靜態(tài)分析的理想起點。在這種情況下,軟件團隊可以調(diào)查所有出現(xiàn)的警告并修復(fù)發(fā)現(xiàn)的錯誤。與其他方法不同,只有很少的警告需要管理,因此開發(fā)人員可以處理額外的工作量。這也是通過工具實施和實施編碼標(biāo)準(zhǔn)的理想時機,因為可以在IDE中以及在將任何代碼提交給版本控制之前(在這里描述的其他情況下也可以這樣做)識別和修復(fù)違規(guī)情況。 。

    靜態(tài)分析在成熟度的三個主要階段中的采用方式通過處理警告積壓的方式有所不同,如下所示:

    在三個主要的成熟階段采用靜態(tài)分析:在一個新建項目中,大多數(shù)報告的警告都得到了調(diào)查和修復(fù),而很少涉及技術(shù)債務(wù)。正在開發(fā)的項目往往積壓了大部分待處理的警告,而只處理關(guān)鍵警告,而維護中的產(chǎn)品往往會推遲大多數(shù)警告。


    配置與過濾


    開源或輕量級靜態(tài)分析工具與商業(yè)高級靜態(tài)分析工具之間的主要區(qū)別之一是能夠配置啟用了哪些檢查程序集進行分析,以及根據(jù)警告類別、文件名、嚴(yán)重性和其他屬性過濾出報告的結(jié)果。這有助于實現(xiàn)不被淹沒的目標(biāo)——開發(fā)人員可以僅關(guān)注他們感興趣的警告類型,并減少在任何給定時間提供的信息量。

    在配置檢查器和過濾結(jié)果之間也需要注意一個差異。盡管最初似乎最好限制全局配置中的規(guī)則數(shù)量,但是應(yīng)該經(jīng)常使用過濾來限制報告的范圍,而不是完全消除檢查程序。如果在配置中關(guān)閉了后來證明很重要的規(guī)則,則警告存儲庫中將沒有歷史記錄,因此您將無法找出錯誤是由于最近的更改引起的還是代碼中已經(jīng)存在的在采用靜態(tài)分析之前。

    我建議使用配置將規(guī)則集僅限制為可預(yù)見的對軟件團隊有用的規(guī)則。同樣,從最終目標(biāo)開始:如果提高安全性是關(guān)鍵目標(biāo),那么啟用所有與安全性相關(guān)的規(guī)則,禁用次要的規(guī)則并啟用諸如CERT C之類的內(nèi)置安全編碼標(biāo)準(zhǔn)是有意義的。然后,如果您使用的是諸如Parasoft C/C++test之類的高級靜態(tài)分析解決方案,則可以利用其內(nèi)置的管理工具來處理從靜態(tài)分析報告生成的數(shù)據(jù),并推動未來的發(fā)展重點。


    總結(jié)


    靜態(tài)分析工具使軟件組織無需執(zhí)行代碼即可檢測和跟蹤錯誤的安全漏洞。這些工具可以應(yīng)用于現(xiàn)有的、遺留的和第三方代碼并提供質(zhì)量。

    靜態(tài)分析的采用在一定程度上根據(jù)項目的成熟度而有所不同。大量的代碼確實會導(dǎo)致大量警告。這是完全可管理的,能否成功采用取決于團隊決定如何處理結(jié)果。針對項目的每個主要成熟度級別引入了各種技術(shù),以及如何將這些工具集成到開發(fā)人員、團隊負責(zé)人和經(jīng)理的日常工作流程中。

    在我的下一篇文章中,我將討論將靜態(tài)分析集成到您的日常工作流程中,請繼續(xù)關(guān)注!


    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();