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

    文檔首頁>>Parasoft C/C++test 使用教程>>在前期步驟中采用靜態(tài)分析

    在前期步驟中采用靜態(tài)分析


    到目前為止,2020年是充滿挑戰(zhàn)的一年。隨著我們中越來越多的人在家外遠(yuǎn)程辦公,比以往任何時(shí)候都重要的是,我們產(chǎn)生的代碼要盡可能的好。靜態(tài)分析是軟件開發(fā)人員以及安全和功能安全專業(yè)人員的理想焦點(diǎn)。

    我們都知道,靜態(tài)代碼分析是我們應(yīng)該做的事情。我們中有些人知道我們應(yīng)該這樣做,因?yàn)樗鼤?huì)幫助我們。其他人則可能感覺像是對(duì)他們施加了靜態(tài)分析,這既浪費(fèi)時(shí)間,又乏味,或者創(chuàng)建工作卻無濟(jì)于事。雖然我想說這些人是錯(cuò)誤的,但不幸的是,他們可能是正確的!


    做的比你能轉(zhuǎn)化的多

    如果靜態(tài)分析緩慢、嘈雜(誤報(bào))、使用時(shí)痛苦、創(chuàng)造工作或無法提供價(jià)值,通常是因?yàn)槟冻龅呐Τ^了轉(zhuǎn)化的余地。正確配置靜態(tài)分析工具也是一個(gè)重要因素,但這本身就是一個(gè)完全獨(dú)立的問題,我將在另一篇文章中介紹。

    對(duì)于這篇文章,我想集中討論許多靜態(tài)分析的首次采用者所犯的一個(gè)錯(cuò)誤——嘗試過早地做太多事情??傮w而言,從一開始就使靜態(tài)分析工作流程和配置正確對(duì)成功至關(guān)重要——減少痛苦,獲得更多收益。第一步是確保您擁有適合組織的正確工具。最近,我們制作了一個(gè)網(wǎng)絡(luò)研討會(huì)和白皮書,涵蓋了如何選擇合適的靜態(tài)分析工具以滿足您的需求的基礎(chǔ)知識(shí),因此請(qǐng)查看這些內(nèi)容。


    從靜態(tài)分析開始

    選擇靜態(tài)代碼分析工具后,需要對(duì)其進(jìn)行配置。您要運(yùn)行哪些檢查程序?我將以一個(gè)簡(jiǎn)單的指南開始:最好從一小組檢查員入手,必要時(shí)甚至只有一個(gè)檢查員,并確保您和您的團(tuán)隊(duì)正在磨練您的靜態(tài)分析技能和工作流程,同時(shí)從中受益匪淺。常見的替代方法是打開一百或更多的檢查程序,這些檢查程序會(huì)產(chǎn)生大型報(bào)告,您會(huì)偶爾進(jìn)行跟進(jìn)。

    靜態(tài)分析工具在豎立安裝之前會(huì)產(chǎn)生很多噪音。當(dāng)我說“力不從心”時(shí),噪音(有時(shí)稱為誤報(bào))壓倒了重要的警告。早期采用有時(shí)是出于學(xué)術(shù)上的追求,其目的是盡早調(diào)查以了解代碼庫中有多少錯(cuò)誤。這種方法不考慮開發(fā)人員的工作流程及其日常使用的工具。這也不符合實(shí)用的需求來編寫、測(cè)試和發(fā)布軟件。

    最好的方法是從小處著手,以不斷不斷地提高代碼質(zhì)量。消除最麻煩的關(guān)鍵代碼問題,然后進(jìn)行擴(kuò)展以查找仍然重要但可能不太危險(xiǎn)的其他問題。讓我們看看它在實(shí)際意義上是如何工作的。

    首先解決大問題

    有時(shí)我們會(huì)看到組織嘗試根據(jù)靜態(tài)分析工具提供的所有可能檢查程序的較大列表,以協(xié)商一致的方式組裝檢查程序的配置列表。盡管看似合理,但是如果您認(rèn)為Parasoft工具具有1000多個(gè)檢查器,則該方法有缺陷,因?yàn)樗鼘W⒂谠摴ぞ呖梢宰鍪裁?,而不是根?jù)客戶支持,預(yù)期環(huán)境等來解決應(yīng)用程序面臨的實(shí)際問題。

    即使錯(cuò)誤類型在摘要中似乎很重要,團(tuán)隊(duì)也可以花費(fèi)大量時(shí)間追查那些沒有提供太多價(jià)值的檢查程序中的違規(guī)行為。將靜態(tài)分析與團(tuán)隊(duì)正在解決或期望面對(duì)的實(shí)際問題聯(lián)系起來至關(guān)重要。縮小檢查人員的名單很重要,但對(duì)于剛開始的團(tuán)隊(duì)或項(xiàng)目仍然可能產(chǎn)生過多的違規(guī)行為。您需要查看所吃“食物”的大小。

    限制靜態(tài)分析的“咀嚼”

    最小化被咬的大小(不僅是檢查器的數(shù)量)的一種好方法是評(píng)估您針對(duì)它運(yùn)行的代碼。如今,大多數(shù)項(xiàng)目都由現(xiàn)有的,舊的或繼承的代碼庫組成。如果這些足夠大,則無法對(duì)此代碼進(jìn)行靜態(tài)分析并專用于解決問題的資源。您必須根據(jù)所分析的代碼量來限制“位數(shù)”。

    一種常見的方法是將對(duì)報(bào)告的警告的操作限制為新開發(fā)或最近修改的代碼。例如,團(tuán)隊(duì)負(fù)責(zé)人決定在下一個(gè)沖刺階段,將使用一組優(yōu)先的檢查器對(duì)所有新代碼進(jìn)行分析。第一組分析報(bào)告用于評(píng)估所需的工作量。如果這對(duì)于一次沖刺來說太多了,則可以進(jìn)一步限制分析。另一方面,如果此方法不能產(chǎn)生足夠的警告,或者錯(cuò)過了質(zhì)量目標(biāo),請(qǐng)擴(kuò)大范圍。

    這一切都是要說的:咬一小口,價(jià)值很高的一口。對(duì)其進(jìn)行修復(fù),完成某些工作,并將其構(gòu)建到您的日常工作和文化中。慢慢添加到它。再設(shè)置一些檢查器,最終,您將一開始就實(shí)現(xiàn)所有需要的檢查器的理想目標(biāo)。


    觀察并逐步增加靜態(tài)分析的價(jià)值

    從小處著手不僅僅是控制可管理的工作流程。它還可以幫助對(duì)該技術(shù)不熟悉并且對(duì)該工具不熟悉的開發(fā)人員快速了解其價(jià)值。通過首先給他們關(guān)鍵的發(fā)現(xiàn),他們看到了對(duì)于修復(fù)和理解測(cè)試或代碼審查可能遺漏了它們很重要的錯(cuò)誤。隨著分析的進(jìn)行,開發(fā)人員將始終獲得最可行的結(jié)果。目的是永遠(yuǎn)不要到達(dá)向開發(fā)人員發(fā)出低價(jià)值警告的位置。浪費(fèi)他們的時(shí)間和工具,您應(yīng)該利用自己的流程將其過濾掉。


    避免分類

    在討論靜態(tài)代碼分析結(jié)果時(shí),經(jīng)常會(huì)進(jìn)行分類。僅當(dāng)流程不堪重負(fù)時(shí),分流才在現(xiàn)實(shí)生活中使用過。咬牙切齒的軟件團(tuán)隊(duì)在啟用默認(rèn)檢查器的情況下在大型代碼庫上運(yùn)行靜態(tài)分析工具,因此不可避免地會(huì)收到許多警告。然后,他們嘗試通過他們說,我需要修復(fù)哪些問題?哪些最重要?這是乏味的、過于主觀的、容易出錯(cuò)的,并且?guī)缀跏遣槐匾摹?

    工具應(yīng)該為您分流。如果沒有,則可能是您使用了錯(cuò)誤的工具、錯(cuò)誤的配置或錯(cuò)誤的方法?,F(xiàn)代的靜態(tài)分析工具必須能夠根據(jù)嚴(yán)重性、優(yōu)先級(jí)和固有風(fēng)險(xiǎn)過濾警告。不要讓工具本身強(qiáng)迫您咬一口。


    總結(jié)

    希望您發(fā)現(xiàn)此建議有用。成功采用靜態(tài)分析需要精簡(jiǎn)步驟,才能大幅度提高質(zhì)量,安全性和安全性。通過限制檢查程序和代碼量的分析范圍來限制您的團(tuán)隊(duì)“受挫”的程度——每個(gè)人都可以看到其價(jià)值。避免“太大的麻煩”避免了許多關(guān)于靜態(tài)分析工具的常見抱怨。 持續(xù)和逐步的改進(jìn)可幫助每個(gè)人學(xué)習(xí)如何進(jìn)行靜態(tài)分析,并從投資中獲得更好的價(jià)值。

    祝您在2020年余下的靜態(tài)分析旅程中好運(yù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); })();